# Organization notes
# Main text includes effect size figures 

# Supp material includes: 
# Raw data plots for all four traits 
# Effect size plot showing all traits (done)
# Contrasts from modeling approach 

Main Text Figures

comb_epr_plot = comb_preds %>% 
  filter(metric == "EPR") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), 
             filter(comb_d, metric == "EPR"), 
             size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), 
              filter(comb_boot_conf_preds, metric == "EPR"), 
              fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  scale_colour_manual(values = comb_colors) + 
  labs(x = "", 
       y = "Egg Production \n(eggs/female/day)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_hs_plot = comb_preds %>% 
  filter(metric == "HF") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "HF"), size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "HF"), fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  labs(x = "", 
       y = "Hatching Success \n(%)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_rf_plot = comb_preds %>% 
  filter(metric == "RF") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "RF"), size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "RF"), fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  labs(x = "Temperature (°C)", 
       y = "Offspring Production \n(offspring/female/day)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_tsc = ggplot(comb_surv, aes(x=Temp, y=Surv, colour=Month)) + 
  geom_point(size=1.5, position=position_jitter(width=0.1, height=0.03)) +
  xlab("Temperature (°C)")+
  ylab("Survivorship \n(proportion survived)")+
  labs(colour = "Month") + 
  geom_hline(yintercept = 0.5, linetype = "dashed") +
  geom_smooth(method = "glm", method.args = list(family = "binomial"), se=T, linewidth = 2) +
  scale_y_continuous(breaks = c(0,1)) + 
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  theme_matt(base_size = 12)

ggarrange(comb_epr_plot, comb_hs_plot, comb_rf_plot, comb_tsc, 
          ncol = 2, nrow = 2,
          common.legend = T, legend = "bottom", 
          labels = "AUTO", vjust = 1)


# ggarrange(comb_epr_plot, comb_hs_plot, comb_rf_plot, comb_tsc, nrow = 1,
#           common.legend = T, legend = "bottom")
combined_opt_coll = comb_params %>% 
  filter(metric == "RF" & term == "topt") %>% 
  ggplot(aes(x = growth_temp, y = estimate, shape = species)) + 
  geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
              method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Optimum (°C)") + 
  xlab("Collection Temperature (°C)") + 
  labs(colour = "Month") + 
  theme_matt(base_size = 12)

combined_opt_diff = comb_params %>% 
  filter(metric == "RF" & term == "topt") %>% 
  ggplot(aes(x = growth_temp, y = margin, shape = species)) +
  geom_hline(yintercept = 0, linewidth =1, linetype = "dashed") +
  geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
              method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  ylab("Margin (°C)") + 
  xlab("Collection Temperature (°C)") + 
  scale_shape_manual(values = c(16,21)) + 
  theme_matt(base_size = 12) 

combined_ld_coll = ggplot(combined_tolerance, aes(x = Coll_temp, y = LD50, shape = species)) + 
  geom_smooth(method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Thermal Tolerance (°C)") + 
  xlab("Collection Temperature (°C)") + 
  theme_matt(base_size = 12)

combined_ld_diff = ggplot(combined_tolerance, aes(x = Coll_temp, y = margin, shape = species)) +
  geom_smooth(method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Warming Tolerance (°C)") + 
  xlab("Collection Temperature (°C)") + 
  theme_matt(base_size = 12)

ggarrange(combined_opt_coll, combined_opt_diff, combined_ld_coll, combined_ld_diff, ncol = 2, nrow = 2, common.legend = T,
          legend = "bottom", labels = "AUTO")

f0_model_females = F0_epr %>% 
  group_by(Month, Treatment, Female) %>% 
  count() %>% 
  filter(n == 2) %>% 
  mutate('female_ID' = paste(Month, Treatment, Female, sep = "_"))

f0_model_data = F0_epr %>% 
  mutate('female_ID' = paste(Month, Treatment, Female, sep = "_")) %>% 
  filter(female_ID %in% f0_model_females$female_ID) %>% 
  mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
         Month = fct_relevel(Month, "June", "August", "November"),
         Day = fct_relevel(Day, "Short", "Long"))
F0_hatched.model = lme4::glmer(data = f0_model_data, family = poisson, 
                               Hatched ~ Treatment * Day * Month + (1|female_ID))

summary(F0_hatched.model)
## Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
##  Family: poisson  ( log )
## Formula: Hatched ~ Treatment * Day * Month + (1 | female_ID)
##    Data: f0_model_data
## 
##      AIC      BIC   logLik deviance df.resid 
##   7322.9   7375.8  -3648.5   7296.9      419 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -9.044 -1.385 -0.256  1.178  8.188 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  female_ID (Intercept) 1.427    1.195   
## Number of obs: 432, groups:  female_ID, 216
## 
## Fixed effects:
##                                         Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                              4.06299    0.19477  20.861  < 2e-16 ***
## TreatmentHeatwave                        0.16319    0.27815   0.587  0.55742    
## DayLong                                 -0.20893    0.02343  -8.918  < 2e-16 ***
## MonthAugust                              0.71281    0.27516   2.591  0.00958 ** 
## MonthNovember                           -4.73525    0.35172 -13.463  < 2e-16 ***
## TreatmentHeatwave:DayLong               -0.40687    0.03551 -11.457  < 2e-16 ***
## TreatmentHeatwave:MonthAugust           -0.08077    0.39427  -0.205  0.83769    
## TreatmentHeatwave:MonthNovember          0.69060    0.46905   1.472  0.14093    
## DayLong:MonthAugust                     -0.40799    0.03391 -12.030  < 2e-16 ***
## DayLong:MonthNovember                    2.32910    0.20062  11.609  < 2e-16 ***
## TreatmentHeatwave:DayLong:MonthAugust    0.32491    0.04852   6.697 2.13e-11 ***
## TreatmentHeatwave:DayLong:MonthNovember -0.06312    0.23667  -0.267  0.78968    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) TrtmnH DayLng MnthAg MnthNv TrH:DL TrH:MA TrH:MN DyL:MA DyL:MN TH:DL:MA
## TretmntHtwv -0.698                                                                        
## DayLong     -0.054  0.038                                                                 
## MonthAugust -0.708  0.494  0.038                                                          
## MonthNovmbr -0.551  0.386  0.030  0.390                                                   
## TrtmntHt:DL  0.036 -0.050 -0.660 -0.025 -0.020                                            
## TrtmntHt:MA  0.494 -0.706 -0.027 -0.698 -0.272  0.035                                     
## TrtmntHt:MN  0.414 -0.593 -0.022 -0.293 -0.750  0.030  0.418                              
## DyLng:MnthA  0.037 -0.026 -0.691 -0.049 -0.021  0.456  0.034  0.015                       
## DyLng:MnthN  0.006 -0.004 -0.117 -0.004 -0.506  0.077  0.003  0.379  0.081                
## TrtmH:DL:MA -0.026  0.037  0.483  0.034  0.014 -0.732 -0.045 -0.022 -0.699 -0.056         
## TrtmH:DL:MN -0.005  0.008  0.099  0.004  0.429 -0.150 -0.005 -0.438 -0.068 -0.848  0.110

knitr::kable(car::Anova(F0_hatched.model, type = "III"))
Chisq Df Pr(>Chisq)
(Intercept) 435.1722039 1 0.0000000
Treatment 0.3441978 1 0.5574162
Day 79.5279360 1 0.0000000
Month 253.7336545 2 0.0000000
Treatment:Day 131.2551698 1 0.0000000
Treatment:Month 2.9847250 2 0.2248408
Day:Month 304.0138675 2 0.0000000
Treatment:Day:Month 45.8612180 2 0.0000000
knitr::kable(emmeans::emmeans(F0_hatched.model, ~ Day | Treatment * Month, type = "response") %>% pairs())
contrast Treatment Month ratio SE df null z.ratio p.value
Short / Long Control June 1.2323565 0.0288718 Inf 1 8.917844 0
Short / Long Heatwave June 1.8511273 0.0494058 Inf 1 23.072465 0
Short / Long Control August 1.8532162 0.0454425 Inf 1 25.159055 0
Short / Long Heatwave August 2.0115022 0.0445963 Inf 1 31.522871 0
Short / Long Control November 0.1200108 0.0239124 Inf 1 -10.640644 0
Short / Long Heatwave November 0.1920146 0.0235545 Inf 1 -13.452169 0

knitr::kable(emmeans::emmeans(F0_hatched.model, ~ Treatment | Day * Month, type = "response") %>% pairs())
contrast Day Month ratio SE df null z.ratio p.value
Control / Heatwave Short June 0.8494307 0.2362733 Inf 1 -0.5866837 0.5574162
Control / Heatwave Long June 1.2759329 0.3555254 Inf 1 0.8745263 0.3818317
Control / Heatwave Short August 0.9208831 0.2572647 Inf 1 -0.2950316 0.7679697
Control / Heatwave Long August 0.9995371 0.2798544 Inf 1 -0.0016538 0.9986804
Control / Heatwave Short November 0.4257991 0.1608150 Inf 1 -2.2606223 0.0237827
Control / Heatwave Long November 0.6812692 0.2167769 Inf 1 -1.2061690 0.2277523

f0_effects = emmeans::emmeans(F0_hatched.model, ~ Treatment | Day * Month, type = "response") %>% pairs() %>% data.frame() %>% 
  mutate(Day = fct_relevel(Day, "Short", "Long"),
         Month = fct_relevel(Month, "June", "August", "November")) %>% 
  ggplot(aes(x = Day, y = ratio, shape = Day)) + 
  facet_wrap(.~Month, nrow = 1) + 
  geom_hline(yintercept = 1) + 
  geom_point(position = position_dodge(width = 0.3), 
             size = 7) + 
  geom_errorbar(aes(ymin = ratio - SE, ymax = ratio + SE),
                position = position_dodge(width = 0.3),
                width = 0.2, linewidth = 1) + 
  labs(x = "Duration", 
       y = "Ratio (Control:Heatwave)",
       shape = "Duration") + 
  theme_bw(base_size = 20) + 
  theme(legend.position = "none", 
        panel.grid = element_blank())
f1_model_data = F1_epr %>% 
  mutate(Offspring_temp = as.factor(Offspring_temp)) %>% 
  ungroup() %>% 
  mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
         Month = fct_relevel(Month, "June", "August", "November"),
         Day = fct_relevel(Day, "Short", "Long"))

f0_epr_plot = ggplot(f0_model_data, 
                 aes(x = Day, y = Total, colour = Treatment)) + 
  facet_grid(.~Month, scales = "free_y") + 
  geom_hline(yintercept = 0) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  labs(y = "Egg Production \n(per female per day)") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5),
        axis.title.x = element_blank(),
        strip.text = element_text(size = 18))

f1_epr_plot = ggplot(f1_model_data, 
                 aes(x = factor(Offspring_temp), y = Total, colour = Parental_treatment)) + 
  facet_grid(Month~Day) + 
  #geom_violin(position = position_dodge(width = 1)) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  scale_y_continuous(breaks = c(0, 100, 200)) + 
  labs(x = "Offspring Temp. (°C)", 
       y = "Egg Production \n(per female per day)",
       colour = "Parental Treatment") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        strip.text = element_text(size = 18))

raw_epr = ggarrange(f0_epr_plot, f1_epr_plot, nrow = 2, 
          heights = c(0.3, 0.7), common.legend = T, legend = "bottom")

###

f0_hs_plot = ggplot(f0_model_data, 
                 aes(x = Day, y = Success, colour = Treatment)) + 
  facet_grid(.~Month, scales = "free_y") + 
  geom_hline(yintercept = 0) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  labs(y = "Hatching Success") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5),
        axis.title.x = element_blank(),
        strip.text = element_text(size = 18))

f1_hs_plot = ggplot(f1_model_data, 
                 aes(x = factor(Offspring_temp), y = Success, colour = Parental_treatment)) + 
  facet_grid(Month~Day) + 
  #geom_violin(position = position_dodge(width = 1)) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  scale_y_continuous(breaks = c(0, 1)) + 
  labs(x = "Offspring Temp. (°C)", 
       y = "Hatching Success",
       colour = "Parental Treatment") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        strip.text = element_text(size = 18))

raw_hs = ggarrange(f0_hs_plot, f1_hs_plot, nrow = 2, 
          heights = c(0.3, 0.7), common.legend = T, legend = "bottom")

###

f0_prod_plot = ggplot(f0_model_data, 
                 aes(x = Day, y = Hatched, colour = Treatment)) + 
  facet_grid(.~Month, scales = "free_y") + 
  geom_hline(yintercept = 0) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  labs(y = "Offspring Production \n(per female per day)") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5),
        axis.title.x = element_blank(),
        strip.text = element_text(size = 18))

f1_prod_plot = ggplot(f1_model_data, 
                 aes(x = factor(Offspring_temp), y = Hatched, colour = Parental_treatment)) + 
  facet_grid(Month~Day) + 
  #geom_violin(position = position_dodge(width = 1)) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  scale_y_continuous(breaks = c(0, 100, 200)) + 
  labs(x = "Offspring Temp. (°C)", 
       y = "Offspring Production \n(per female per day)",
       colour = "Parental Treatment") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        strip.text = element_text(size = 18))

raw_production = ggarrange(f0_prod_plot, f1_prod_plot, nrow = 2, 
          heights = c(0.3, 0.7), common.legend = T, legend = "bottom")

ggarrange(raw_epr, raw_hs, raw_production, nrow = 1, common.legend = T, legend = "bottom",
          labels = "AUTO")

# F1_hatched.model = lme4::glmer(data = f1_model_data, family = poisson, 
#                                Hatched ~ Parental_treatment * Day * Offspring_temp + 
#                                  (1 + Parental_treatment|Month))

F1_hatched.model = glm(data = f1_model_data, family = "poisson",
                       Hatched ~ Parental_treatment * Day * Offspring_temp * Month)

summary(F1_hatched.model)
## 
## Call:
## glm(formula = Hatched ~ Parental_treatment * Day * Offspring_temp * 
##     Month, family = "poisson", data = f1_model_data)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -15.6120   -4.1732   -0.6726    1.8966   22.9798  
## 
## Coefficients: (1 not defined because of singularities)
##                                                                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                                                        3.312e+00  3.486e-02  95.008  < 2e-16 ***
## Parental_treatmentHeatwave                                        -3.379e-01  5.402e-02  -6.255 3.97e-10 ***
## DayLong                                                           -1.554e+00  8.344e-02 -18.623  < 2e-16 ***
## Offspring_temp17                                                   1.181e+00  3.985e-02  29.635  < 2e-16 ***
## Offspring_temp22                                                   1.209e+00  3.988e-02  30.304  < 2e-16 ***
## MonthAugust                                                       -1.122e+00  7.033e-02 -15.953  < 2e-16 ***
## MonthNovember                                                     -1.968e+00  1.515e-01 -12.990  < 2e-16 ***
## Parental_treatmentHeatwave:DayLong                                -6.622e-01  1.559e-01  -4.249 2.15e-05 ***
## Parental_treatmentHeatwave:Offspring_temp17                        8.120e-01  5.936e-02  13.679  < 2e-16 ***
## Parental_treatmentHeatwave:Offspring_temp22                        3.063e-01  6.068e-02   5.048 4.47e-07 ***
## DayLong:Offspring_temp17                                           1.864e+00  8.723e-02  21.370  < 2e-16 ***
## DayLong:Offspring_temp22                                           1.517e+00  8.798e-02  17.237  < 2e-16 ***
## Parental_treatmentHeatwave:MonthAugust                            -1.351e-01  1.124e-01  -1.201 0.229590    
## Parental_treatmentHeatwave:MonthNovember                           1.635e+01  8.570e+01   0.191 0.848711    
## DayLong:MonthAugust                                                2.054e+00  1.138e-01  18.047  < 2e-16 ***
## DayLong:MonthNovember                                             -2.498e+00  1.014e+00  -2.463 0.013786 *  
## Offspring_temp17:MonthAugust                                      -4.293e-01  9.084e-02  -4.726 2.30e-06 ***
## Offspring_temp22:MonthAugust                                      -6.995e-01  8.742e-02  -8.002 1.23e-15 ***
## Offspring_temp17:MonthNovember                                    -3.275e-01  1.856e-01  -1.765 0.077602 .  
## Offspring_temp22:MonthNovember                                    -1.585e+01  8.569e+01  -0.185 0.853203    
## Parental_treatmentHeatwave:DayLong:Offspring_temp17               -5.423e-01  1.604e-01  -3.380 0.000724 ***
## Parental_treatmentHeatwave:DayLong:Offspring_temp22                3.778e-01  1.612e-01   2.344 0.019102 *  
## Parental_treatmentHeatwave:DayLong:MonthAugust                    -2.488e-04  2.081e-01  -0.001 0.999046    
## Parental_treatmentHeatwave:DayLong:MonthNovember                  -1.434e+01  8.569e+01  -0.167 0.867053    
## Parental_treatmentHeatwave:Offspring_temp17:MonthAugust           -1.349e-01  1.327e-01  -1.017 0.309325    
## Parental_treatmentHeatwave:Offspring_temp22:MonthAugust            5.513e-01  1.313e-01   4.198 2.69e-05 ***
## Parental_treatmentHeatwave:Offspring_temp17:MonthNovember         -1.503e+01  8.570e+01  -0.175 0.860799    
## Parental_treatmentHeatwave:Offspring_temp22:MonthNovember          1.006e+00  1.369e+00   0.735 0.462321    
## DayLong:Offspring_temp17:MonthAugust                              -7.350e-01  1.299e-01  -5.657 1.54e-08 ***
## DayLong:Offspring_temp22:MonthAugust                              -9.589e-01  1.301e-01  -7.372 1.69e-13 ***
## DayLong:Offspring_temp17:MonthNovember                            -2.574e+00  1.241e+00  -2.074 0.038055 *  
## DayLong:Offspring_temp22:MonthNovember                             1.380e+01  8.569e+01   0.161 0.872056    
## Parental_treatmentHeatwave:DayLong:Offspring_temp17:MonthAugust    6.825e-02  2.244e-01   0.304 0.761005    
## Parental_treatmentHeatwave:DayLong:Offspring_temp22:MonthAugust   -7.590e-01  2.280e-01  -3.329 0.000872 ***
## Parental_treatmentHeatwave:DayLong:Offspring_temp17:MonthNovember  2.040e+01  8.569e+01   0.238 0.811813    
## Parental_treatmentHeatwave:DayLong:Offspring_temp22:MonthNovember         NA         NA      NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 62808  on 930  degrees of freedom
## Residual deviance: 25570  on 896  degrees of freedom
## AIC: 28981
## 
## Number of Fisher Scoring iterations: 11
#car::Anova(F1_hatched.model,test = "F", type = "III")
f1_hatched_contrasts = emmeans::emmeans(F1_hatched.model, ~ Parental_treatment | Day * Month * Offspring_temp, type = "response") %>% pairs() %>% data.frame() %>% 
  #mutate(estimate = estimate * -1) %>% 
  drop_na() %>% 
  mutate("ID" = paste0(Month, Offspring_temp))

f1_effects = ggplot(f1_hatched_contrasts, aes(x = Day, y = ratio, group = ID)) + 
  facet_grid(Offspring_temp~Month) + 
  geom_hline(yintercept = 1) +
  geom_line(linewidth = 0.8) + 
  geom_point(size = 2) + 
  geom_errorbar(aes(ymin = ratio - SE, ymax = ratio + SE), width = 0.1, linewidth = 1) + 
  labs(x = "Duration", 
       y = "Ratio (Control:Heatwave)") + 
  theme_bw(base_size = 20) + 
  theme(panel.grid = element_blank())

ggarrange(f0_effects, f1_effects, nrow = 2, heights = c(0.3, 0.7))

f1_size_data = F1_fbs %>% 
  ungroup() %>% 
  mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
         Month = fct_relevel(Month, "June", "August", "November"),
         Day = fct_relevel(Day, "Short", "Long"))

F1_size.model = glm(data = f1_size_data,
                    Size ~ Parental_treatment * Day * Offspring_temp * Month)

summary(F1_size.model)
## 
## Call:
## glm(formula = Size ~ Parental_treatment * Day * Offspring_temp * 
##     Month, data = f1_size_data)
## 
## Deviance Residuals: 
##       Min         1Q     Median         3Q        Max  
## -0.145900  -0.025187  -0.002125   0.027106   0.156603  
## 
## Coefficients:
##                                                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                                                      1.1129676  0.0191453  58.133  < 2e-16 ***
## Parental_treatmentHeatwave                                      -0.2021937  0.0314027  -6.439 2.02e-10 ***
## DayLong                                                         -0.0639884  0.0270852  -2.362 0.018380 *  
## Offspring_temp                                                  -0.0116568  0.0010991 -10.606  < 2e-16 ***
## MonthAugust                                                     -0.0778029  0.0286411  -2.716 0.006734 ** 
## MonthNovember                                                   -0.1583042  0.0549167  -2.883 0.004044 ** 
## Parental_treatmentHeatwave:DayLong                               0.1530333  0.0414772   3.690 0.000239 ***
## Parental_treatmentHeatwave:Offspring_temp                        0.0105033  0.0017407   6.034 2.40e-09 ***
## DayLong:Offspring_temp                                           0.0033498  0.0015625   2.144 0.032333 *  
## Parental_treatmentHeatwave:MonthAugust                           0.1597975  0.0426050   3.751 0.000188 ***
## Parental_treatmentHeatwave:MonthNovember                         0.0138210  0.0735478   0.188 0.850986    
## DayLong:MonthAugust                                             -0.0208334  0.0394776  -0.528 0.597827    
## DayLong:MonthNovember                                            0.1684485  0.0627450   2.685 0.007404 ** 
## Offspring_temp:MonthAugust                                       0.0030094  0.0016350   1.841 0.066035 .  
## Offspring_temp:MonthNovember                                     0.0104002  0.0037188   2.797 0.005281 ** 
## Parental_treatmentHeatwave:DayLong:Offspring_temp               -0.0074358  0.0023391  -3.179 0.001533 ** 
## Parental_treatmentHeatwave:DayLong:MonthAugust                  -0.0655264  0.0576266  -1.137 0.255826    
## Parental_treatmentHeatwave:DayLong:MonthNovember                 0.0366208  0.0858275   0.427 0.669723    
## Parental_treatmentHeatwave:Offspring_temp:MonthAugust           -0.0104701  0.0023926  -4.376 1.36e-05 ***
## Parental_treatmentHeatwave:Offspring_temp:MonthNovember         -0.0008553  0.0044990  -0.190 0.849261    
## DayLong:Offspring_temp:MonthAugust                               0.0021581  0.0022665   0.952 0.341278    
## DayLong:Offspring_temp:MonthNovember                            -0.0099254  0.0040868  -2.429 0.015364 *  
## Parental_treatmentHeatwave:DayLong:Offspring_temp:MonthAugust    0.0029113  0.0032879   0.885 0.376166    
## Parental_treatmentHeatwave:DayLong:Offspring_temp:MonthNovember -0.0041042  0.0051223  -0.801 0.423219    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.001721073)
## 
##     Null deviance: 2.7198  on 863  degrees of freedom
## Residual deviance: 1.4457  on 840  degrees of freedom
##   (2 observations deleted due to missingness)
## AIC: -3021.6
## 
## Number of Fisher Scoring iterations: 2
car::Anova(F1_size.model, type = "III")
## Analysis of Deviance Table (Type III tests)
## 
## Response: Size
##                                             LR Chisq Df Pr(>Chisq)    
## Parental_treatment                            41.457  1  1.205e-10 ***
## Day                                            5.581  1  0.0181527 *  
## Offspring_temp                               112.484  1  < 2.2e-16 ***
## Month                                         12.730  2  0.0017203 ** 
## Parental_treatment:Day                        13.613  1  0.0002246 ***
## Parental_treatment:Offspring_temp             36.410  1  1.599e-09 ***
## Day:Offspring_temp                             4.596  1  0.0320460 *  
## Parental_treatment:Month                      15.161  2  0.0005104 ***
## Day:Month                                      9.125  2  0.0104334 *  
## Offspring_temp:Month                           9.540  2  0.0084791 ** 
## Parental_treatment:Day:Offspring_temp         10.105  1  0.0014784 ** 
## Parental_treatment:Day:Month                   2.062  2  0.3566473    
## Parental_treatment:Offspring_temp:Month       20.328  2  3.852e-05 ***
## Day:Offspring_temp:Month                       8.623  2  0.0134123 *  
## Parental_treatment:Day:Offspring_temp:Month    2.110  2  0.3482539    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
day_cols = c("Short" = "grey80", "Long" = "grey30")

size_temp1 = ggplot(f1_size_data, aes(x = Offspring_temp, y = Size, colour = Parental_treatment)) + 
  facet_grid(Month~Day) + 
  geom_jitter(width = 0.5, size = 1.6, alpha = 0.4) +
  geom_smooth(method = "lm", linewidth = 1.4, alpha = 0.2) + 
  labs(x = "Offspring Temperature (°C)",
       y = "Size (mm)",
       colour = "Parental Treatment") + 
  scale_x_continuous(breaks = c(12,17,22)) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  theme_matt(base_size = 15) + theme(legend.position = "bottom",
                                     panel.grid = element_blank(),
                                     panel.border = element_rect(fill = NA, colour = "black"))

#car::Anova(f1_size.model, type = "III")
size_temp2 = emmeans::emtrends(F1_size.model, c("Month", "Day", "Parental_treatment"), var = "Offspring_temp") %>% 
  as.data.frame() %>% 
  ggplot(aes(x = Parental_treatment, y = Offspring_temp.trend, 
             colour = Day, group = Day)) + 
  facet_wrap(Month~.) + 
  geom_hline(yintercept = 0) + 
  geom_line(linewidth = 1.5,
            position = position_dodge(width = 0.5)) + 
  geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),
                linewidth = 1.5, width = 0.5,
                position = position_dodge(width = 0.5)) + 
  geom_point(size = 3,
             position = position_dodge(width = 0.5)) + 
  scale_colour_manual(values = day_cols) + 
  labs(x = "Parental Treatment",  
       y = "Size Slope (mm / °C)") + 
  theme_matt(base_size = 15) + 
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 290,
                                   hjust = 0, vjust = 0.5),
        plot.background = element_rect(fill = "white"))

ggarrange(size_temp1, size_temp2, labels = "AUTO", common.legend = F, legend = "bottom")

f1_size_contrasts = emmeans::emmeans(F1_size.model, ~ Parental_treatment | Day * Month * Offspring_temp, type = "response", at = list(Offspring_temp = c(12,17,22))) %>% pairs() %>% data.frame() %>% 
  drop_na() %>% 
  mutate("ID" = paste0(Month, Offspring_temp)) %>% 
  filter(!(ID == "November12" & Day == "Short")) %>% 
  filter(!(ID == "November22" & Day == "Short"))

ggplot(f1_size_contrasts, aes(x = Day, y = estimate, group = ID)) + 
  facet_grid(Offspring_temp~Month) + 
  geom_hline(yintercept = 0) +
  geom_line(linewidth = 0.8) + 
  geom_point(size = 2) + 
  geom_errorbar(aes(ymin = estimate - SE, ymax = estimate + SE), width = 0.1, linewidth = 1) + 
  labs(x = "Duration", 
       y = "Effect (mm; Control - Heatwave)") + 
  theme_bw(base_size = 20) + 
  theme(panel.grid = element_blank())

# F0_rf_summary$month = factor(F0_rf_summary$month, levels = c("June", "August", "November"))
# F0_rf_summary$duration = factor(F0_rf_summary$duration, levels = c("short", "long"))
# F0_dur_summary$month = factor(F0_dur_summary$month, levels = c("June", "August", "November"))
# 
# param_list = list("colour" = "black",
#                   "width" = 0.2) 
# 
# RF_short_db = plot(F0_RF_short, 
#                    axes.title.fontsize = 10,
#                    tick.fontsize = 10,
#                    effsize.markersize = 3,
#                    swarmplot.params = param_list,
#                    rawplot.ylabel = "Production",
#                    theme = ggpubr::theme_pubr())
# 
# RF_long_db = plot(F0_RF_long, 
#                   axes.title.fontsize = 10,
#                   tick.fontsize = 10,
#                   effsize.markersize = 3,
#                   swarmplot.params = param_list,
#                   rawplot.ylabel = "Production",
#                   theme = ggpubr::theme_pubr())
# 
# b1 = ggplot() + theme_pubclean() + ggtitle("          Short Heat Waves")
# b2 = ggplot() + theme_pubclean() + ggtitle("          Long Heat Waves")
# F0_fecundity_plot = ggarrange(b1, RF_short_db, b2, RF_long_db, ncol = 1, nrow = 4, heights = c(0.1, 1, 0.1, 1))
# x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long")
# 
# F0_grid = F0_rf_summary %>% 
#   mutate(month = fct_relevel(month, "June", "August", "November")) %>% 
#   ggplot(aes(x = duration, y = difference, colour = trait, shape = duration)) + 
#   facet_grid(. ~ month) + 
#   geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
#   geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1.3) + 
#   geom_point(size = 5, fill = "white") + 
#   scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) + 
#   scale_shape_manual(values = c("long" = 16, "short" = 21)) + 
#   scale_x_discrete(labels= x.axis_labels) +
#   ggtitle("Direct Effects (F0)") + 
#   xlab("") +
#   ylab("Effect Size\nHeatwave - Control") + 
#   ylim(-1,1.1) + 
#   theme_bw(base_size = 12) + 
#   theme(panel.grid = element_blank(),
#         axis.text = element_text(colour = "black"),
#         axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
#         legend.position = "none")
# 
# F1_summary = bind_rows(F1_rf_effect_size, F1_bs_effect_size) %>% 
#   dplyr::select(variable, difference, 
#                 bca_ci_low, bca_ci_high, 
#                 month, duration, trait, generation, off_temp) %>% 
#   mutate("order_code" = paste(trait, duration, sep = "_"),
#          "order_number" = case_when(
#            order_code == "production_short" ~ 1,
#            order_code == "production_long" ~ 2,
#            order_code == "body size_short" ~ 3,
#            order_code == "body size_long" ~ 4),
#          month = fct_relevel(month, "June", "August", "November"))
# 
# F1_summary$order_number = factor(F1_summary$order_number, levels = c(1,2,3,4))
# F1_grid = ggplot(F1_summary, aes(x = order_number, y = difference, colour = trait, shape = duration, group = trait)) +
#   facet_grid(off_temp ~ month, ) + 
#   geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
#   geom_line() + 
#   geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1) + 
#   geom_point(size = 3, fill = "white") + 
#   scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) + 
#   scale_shape_manual(values = c("long" = 16, "short" = 21)) + 
#   xlim(0.5,4.5) + 
#   scale_x_discrete(labels= x.axis_labels) +
#   xlab("") +
#   ylab("Effect Size\nHeatwave - Control") + 
#   ggtitle("Transgenerational Effects (F1)") + 
#   theme_bw(base_size = 12) + 
#   theme(panel.grid = element_blank(),
#         strip.background.x = element_blank(),
#         strip.text.x = element_blank(),
#         axis.text = element_text(colour = "black"),
#         axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))
# 
# ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.45,1), common.legend = T, legend = "right")

Supplemental Information

#field tpc parameters
comb_params %>%  
  mutate(curve_id = fct_relevel(curve_id, c("January", "February", "March", "April", "May", "June", 
                                            "July", "August", "September", "October", "November_1", "November_2"))) %>% 
  ggplot(aes(x = curve_id, y = estimate, colour = species)) +
  facet_wrap(term~metric, scales = 'free_y') + 
  geom_point(size = 4) +
  geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
  scale_colour_manual(values = c("royalblue1", "indianred2")) + 
  labs(x = "Month",
       y = "Parameter Estimate",
       colour = "Species") + 
  theme_bw(base_size = 16) +
  theme(panel.grid = element_blank(),
        axis.text.x = element_text(angle = 315, hjust = 0, vjust = 0.5))

#field tpc parameters
ggplot(comb_params, aes(x = growth_temp, y = estimate, colour = species)) +
  facet_wrap(term~metric, scales = 'free_y') + 
  geom_smooth(data = filter(comb_params, curve_id != "November_2"),
              method = "lm", se = F) + 
  geom_point(size = 4) +
  geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
  scale_colour_manual(values = c("royalblue1", "indianred2")) + 
  labs(x = "Collection Temperature (°C)",
       y = "Parameter Estimate",
       colour = "Species") + 
  theme_bw(base_size = 12) +
  theme(panel.grid = element_blank())

comb_params %>% 
  filter(term == "topt") %>% 
  ggplot(aes(x = growth_temp, y = margin, colour = species, group = species)) + 
  facet_grid(metric~., scales = 'free_y') + 
  geom_hline(yintercept = 0) +
  geom_smooth(data = filter(comb_params, term == "topt" & curve_id != "November_2"),
              method = "lm", se = F, linewidth = 1, colour = "black") + 
  geom_point(size = 4) +
  scale_colour_manual(values = c("royalblue1", "indianred2")) + 
  labs(x = "Collection Temperature",
       y = "Safety Margin") + 
  theme_bw(base_size = 18) +
  theme(panel.grid = element_blank())

# #Subsequent Rows
# F1_hs_effect_size$trait = "success"
# F1_hs_effect_size$generation = "F1"
# 
# F1_total_effect_size$trait = "epr"
# F1_total_effect_size$generation = "F1"
# 
# F1_rf_effect_size$trait = "production"
# F1_rf_effect_size$generation = "F1"
# 
# F1_bs_effect_size$trait = "body size"
# F1_bs_effect_size$generation = "F1"
# 
# F0_data = bind_rows(F0_hs_summary, F0_total_summary,F0_rf_summary, F0_size_summary) %>% 
#   dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, trait, generation) %>% 
#   mutate("order_code" = paste(trait, duration, sep = "_"),
#          "order_number" = case_when(
#            order_code == "total_short" ~ 1,
#            order_code == "total_long" ~ 2,
#            order_code == "success_short" ~ 3,
#            order_code == "success_long" ~ 4,
#            order_code == "production_short" ~ 5,
#            order_code == "production_long" ~ 6,
#            order_code == "size_long" ~ 7),
#          month = fct_relevel(month, "June", "August", "November"),
#          trait = fct_relevel(trait, "total", "success", "production", "size"),
#          duration = fct_relevel(duration, "short", "long"),
#          group_ID = paste(month, trait, sep = "_"))
# 
# F0_data$order_number = factor(F0_data$order_number, levels = c(1,2,3,4,5,6,7))
# 
# 
# F1_data = bind_rows(F1_total_effect_size, F1_hs_effect_size, F1_rf_effect_size, F1_bs_effect_size) %>% 
#   dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, generation, off_temp) %>% 
#   mutate("order_code" = paste(trait, duration, sep = "_"),
#          "order_number" = case_when(
#            order_code == "epr_short" ~ 1,
#            order_code == "epr_long" ~ 2,
#            order_code == "success_short" ~ 3,
#            order_code == "success_long" ~ 4,
#            order_code == "production_short" ~ 5,
#            order_code == "production_long" ~ 6,
#            order_code == "body size_short" ~ 7,
#            order_code == "body size_long" ~ 8),
#          trait = if_else(trait == "epr", "total", trait),
#          month = fct_relevel(month, "June", "August", "November"),
#          trait = fct_relevel(trait, "total", "success", "production", "size"),
#          duration = fct_relevel(duration, "short", "long"))
# 
# 
# F1_data$order_number = factor(F1_data$order_number, levels = c(1,2,3,4,5,6,7,8))
# 
# #Top row - F0 (direct effects)
# x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long", 
#                   "5" = "short", "6" = "long", "7" = "short", "8" = "long")
# 
# F0_grid = ggplot(F0_data, aes(x = duration, y = difference, colour = trait, group = group_ID)) + 
#   facet_grid(. ~ month) + 
#   geom_line(position = position_dodge(width = 0.7),
#             linewidth = 1) + 
#   geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
#   geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1, 
#                 position = position_dodge(width = 0.7)) + 
#   geom_point(size = 4, fill = "white", position = position_dodge(width = 0.7)) + 
#   scale_shape_manual(values = c("long" = 16, "short" = 21)) + 
#   scale_x_discrete(labels= x.axis_labels) +
#   scale_colour_manual(values = c("size" = "darkgrey",
#                                  "success" = "gold",
#                                  "production" = "forestgreen",
#                                  "total" = "cornflowerblue")) +  
#   xlab("") +
#   ylab("Effect Size\nHeatwave - Control") + 
#   theme_bw(base_size = 12) + 
#   theme(panel.grid = element_blank(),
#         axis.text = element_text(colour = "black"),
#         axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
#         legend.position = "none")
# 
# #Following three rows - F1 (transgeneration / indirect effects)
# F1_grid = ggplot(F1_data, aes(x = duration, y = difference, colour = trait, group = trait)) + 
#   facet_grid(off_temp ~ month, ) + 
#   geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
#   geom_line(position = position_dodge(width = 0.5),
#             linewidth = 1) + 
#   geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1,
#                 position = position_dodge(width = 0.5)) + 
#   geom_point(size = 3, fill = "white", position = position_dodge(width = 0.5)) + 
#   scale_shape_manual(values = c("long" = 16, "short" = 21)) + 
#   xlim(0.5,4.5) + 
#   scale_x_discrete(labels= x.axis_labels) +
#   scale_colour_manual(values = c("size" = "darkgrey",
#                                  "success" = "gold",
#                                  "production" = "forestgreen",
#                                  "total" = "cornflowerblue")) + 
#   xlab("") +
#   ylab("Effect Size \nHeatwave - Control") + 
#   theme_bw(base_size = 12) + 
#   theme(panel.grid = element_blank(),
#         strip.background.x = element_blank(),
#         strip.text.x = element_blank(),
#         axis.text = element_text(colour = "black"),
#         axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))
# 
# ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.35,1), common.legend = T, legend = "right", labels = "AUTO")
# effect_corr = F1_summary %>% 
#   select(trait, difference, month, duration, off_temp) %>%  
#   pivot_wider(id_cols = c(month, duration, off_temp),
#               names_from = trait, 
#               values_from = difference)
# 
# ggplot(effect_corr, aes(x = `body size`, y = production)) + 
#   geom_hline(yintercept = 0) + 
#   geom_vline(xintercept = 0) + 
#   geom_point(size = 3) + 
#   geom_smooth(method = "lm", se = F,
#               colour = "grey60",
#               size = 1) + 
#   labs(x = "Body Size Effect",
#        y = "Production Effect") + 
#   theme_matt()
#Effect of heatwave duration WITHIN treatment

f0_model_data %>%  
  group_by(Treatment, Day, Month) %>% 
  summarise(mean_hatched = mean(Hatched, na.rm = T)) %>% 
  ungroup() %>% 
  pivot_wider(id_cols = c("Treatment", "Month"),
              values_from = mean_hatched, 
              names_from = Day) %>% 
  mutate("effect" = Long - Short)
## # A tibble: 6 × 5
##   Treatment Month      Short  Long effect
##   <chr>     <fct>      <dbl> <dbl>  <dbl>
## 1 Control   June     104.    84.4  -19.6 
## 2 Control   August   125.    67.2  -57.3 
## 3 Control   November   0.871  7.26   6.39
## 4 Heatwave  June     108.    58.3  -49.6 
## 5 Heatwave  August   170.    84.4  -85.4 
## 6 Heatwave  November   2.2   11.5    9.26

duration.model = lme4::lmer(data = f0_model_data, 
                            Hatched ~ Treatment * Day * Month + (1|Month))

duration_pairs = emmeans::emmeans(duration.model, 
                                  ~ Day | Month * Treatment) %>% 
  pairs()

as.data.frame(summary(duration_pairs))[c('Month', 
                                         'Treatment', 
                                         'contrast', 
                                         'estimate', 
                                         'SE')] %>% 
  mutate(Month = fct_relevel(Month, c("June", "August", "November")),
         estimate = estimate * -1) %>% #Flips sign to make contrast Long - Short
  ggplot(aes(x = Month, fill = Treatment, y = estimate)) + 
  geom_bar(stat = "identity", position = position_dodge(width = 0.9), colour = "black", size = 1) + 
  geom_errorbar(aes(ymin = estimate - SE, ymax = estimate + SE),
                width = 0.1, linewidth = 1,
                position = position_dodge(width = 0.9)) + 
  geom_hline(yintercept = 0) + 
  scale_fill_manual(values = c("grey30", "white")) + 
  labs(x = "",
       y = "Duration Contrast \n Long - Short events") + 
  theme_pubr(base_size = 18)

# How does heat wave duration affect transgenerational effects? Reaction norms shown below for effect size comparisons (heatwave - control) for different duration of parental exposure
# F1_data %>% 
#   dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>% 
#   mutate("ID" = paste(month, off_temp, trait, sep = "_"),
#          month = fct_relevel(month, c("June", "August", "November")),
#          duration = fct_relevel(duration, c("short", "long"))) %>% 
#   ggplot(aes(x = duration, y = difference, colour = month, group = ID)) + 
#   facet_wrap(trait~.) + 
#   geom_hline(yintercept = 0) + 
#   geom_line(size = 1, position = position_dodge(width = 0.1)) + 
#   geom_point(size = 2, position = position_dodge(width = 0.1)) + 
#   geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
#                 size = 0.75, width = 0.1,
#                 position = position_dodge(width = 0.1)) + 
#   labs(x = "Parental Exposure Duration", 
#        y = "Effect Size (Hedge's g) \n Heatwave - Control") + 
#   ylim(-5,5) + 
#   theme_pubr(base_size = 18)
# #Pulls out reaction norms where there's a sign change (changes from positive, neutral, or negative between duration groups) 
# 
# duration_effects = F1_data %>% 
#   dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>% 
#   mutate("ID" = paste(month, off_temp, trait, sep = "_"),
#          month = fct_relevel(month, c("June", "August", "November")),
#          duration = fct_relevel(duration, c("short", "long"))) %>% 
#   group_by(ID, trait, duration) %>%  
#   mutate("zero_diff" = case_when(
#     sign(bca_ci_low) == sign(bca_ci_high) ~ "does not overlap zero",
#     sign(bca_ci_low) != sign(bca_ci_high) ~ "overlaps zero"
#   )) %>% 
#   ungroup(duration) %>% 
#   mutate("change" = case_when(
#     sign(difference)[1] == sign(difference)[2] & zero_diff[1] == zero_diff[2] ~ "Same",
#     sign(difference)[1] != sign(difference)[2] & zero_diff[1] == "overlaps zero" & zero_diff[2] == "overlaps zero" ~ "Same",
#     sign(difference)[1] != sign(difference)[2] & zero_diff[1] == zero_diff[2] & zero_diff[1] == "does not overlap zero" ~ "Different",
#     sign(difference)[1] != sign(difference)[2] & zero_diff[1] != zero_diff[2] ~ "Different",
#     sign(difference)[1] == sign(difference)[2] & zero_diff[1] != zero_diff[2] ~ "Different"
#   )) %>% 
#   arrange(month, off_temp, trait) %>% 
#   filter(change == "Different")
# 
# select_rnorms = duration_effects %>% 
#   dplyr::select(-duration, -difference, -bca_ci_low, -bca_ci_high, -ID, -zero_diff) %>% 
#   distinct()
# 
# sig_changes = F1_data %>% 
#   dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>% 
#   mutate("ID" = paste(month, off_temp, trait, sep = "_"),
#          month = fct_relevel(month, c("June", "August", "November")),
#          duration = fct_relevel(duration, c("short", "long"))) %>% 
#   filter(ID %in% select_rnorms$ID)
# 
# ggplot(sig_changes, aes(x = duration, y = difference, colour = month, group = ID)) + 
#   facet_wrap(trait~.) + 
#   geom_hline(yintercept = 0) + 
#   geom_line(size = 1, position = position_dodge(width = 0.1)) + 
#   geom_point(size = 2, position = position_dodge(width = 0.1)) + 
#   geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
#                 size = 0.75, width = 0.1,
#                 position = position_dodge(width = 0.1)) + 
#   geom_label_repel(data = sig_changes %>% filter(duration == "long"), 
#                    aes(label = off_temp, 
#                        x = duration,
#                        y = difference, 
#                        color = month),
#                    box.padding = 0.5,
#                    nudge_x = 0.2,
#                    size = 7,
#                    show.legend=FALSE) + 
#   labs(x = "Parental Exposure Duration", 
#        y = "Effect Size (Hedge's g)\nHeatwave - Control") + 
#   ylim(-5,5) + 
#   theme_pubr(base_size = 18)
LS0tCnRpdGxlOiAiRmlndXJlcyBmb3IgU2Vhc29uYWxseSB2YXJpYWJsZSB0aGVybWFsIHBlcmZvcm1hbmNlIGN1cnZlcyBwcmV2ZW50IGFkdmVyc2UgZWZmZWN0cyBvZiBoZWF0d2F2ZXMiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgICAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZmxvYXQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICAgICAgICB0b2M6IHRydWUKICAgICAgICAgIHRvY19kZXB0aDogMgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZmlnLmFsaWduPSJjZW50ZXIiLCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0ga25pdHI6OmlzX2h0bWxfb3V0cHV0KCksCiAgZmlnLmFsaWduID0gImxlZnQiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIGNvbGxhcHNlID0gVCwKICBkZXYgPSBjKCJwbmciLCAicGRmIikKKQoKc3QuZXJyIDwtIGZ1bmN0aW9uKHgsIG5hLnJtPUZBTFNFKSB7CiAgaWYobmEucm09PVRSVUUpIHggPC0gbmEub21pdCh4KQogIHNkKHgpL3NxcnQobGVuZ3RoKHgpKQp9Cgp0aGVtZV9tYXR0ID0gZnVuY3Rpb24oYmFzZV9zaXplID0gMTgsCiAgICAgICAgICAgICAgICAgICAgICBkYXJrX3RleHQgPSAiZ3JleTIwIil7CiAgbWlkX3RleHQgPC0gIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKGRhcmtfdGV4dCwgImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA1KVsyXQogIGxpZ2h0X3RleHQgPC0gIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKGRhcmtfdGV4dCwgImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA1KVszXQogIAogIGdncHVicjo6dGhlbWVfcHVicihiYXNlX2ZhbWlseT0ic2FucyIpICUrcmVwbGFjZSUgCiAgICB0aGVtZSgKICAgICAgcGFuZWwuYmFja2dyb3VuZCAgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLCAKICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwKICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gbWlkX3RleHQsIGxpbmVoZWlnaHQgPSAxLjEpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbigwLCA4LCAwLCAwKSksCiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9YmFzZV9zaXplICogMC45KSwKICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAwLjksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksCiAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAuMjUsIDAuMjUsIDAuMjUsIDAuMjUsImNtIikKICAgICkKfQoKaDFfZXByJE1vbnRoID0gZmFjdG9yKGgxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXJfMSIsICJOb3ZlbWJlcl8yIikpCgpodWRzX2gxX2VwciRNb250aCA9IGZhY3RvcihodWRzX2gxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKdG9uc2FfY29sb3JzID0gYygiSnVseSIgPSAiIzc5MTEwMSIsICJBdWd1c3QiID0gIiNBRDIxMDYiLCAiU2VwdGVtYmVyIiA9ICIjQ0MzNDAzIiwgCiAgICAgICAgICAgICAgICAgIk9jdG9iZXIiID0gIiNFRjVGMDgiLCAiTm92ZW1iZXJfMSIgPSAiI0YyNzAwNiIsICJOb3ZlbWJlcl8yIiA9ICIjRUVCNjBBIikKCmh1ZHNfY29sb3JzID0gYygiSmFudWFyeSIgPSAiIzA2MUIyNCIsICJGZWJydWFyeSIgPSAiIzBGNDI1NiIsICJNYXJjaCIgPSAiIzE1NkQ4RCIsIAogICAgICAgICAgICAgICAgIkFwcmlsIiA9ICIjMkZBQURDIiwgIk1heSIgPSAiIzYxQkZFMyIsICJKdW5lIiA9ICIjOTdENUVFIikKCmNvbWJfY29sb3JzID0gYyhodWRzX2NvbG9ycywgdG9uc2FfY29sb3JzKQoKYSA9IGdncGxvdCgpICsgdGhlbWVfcHViY2xlYW4oKQoKc3VydiRNb250aCA9IGZhY3RvcihzdXJ2JE1vbnRoLCBsZXZlbHMgPSBjKCJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKaHVkc19zdXJ2JE1vbnRoID0gZmFjdG9yKGh1ZHNfc3VydiRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKY29tYl9wcmVkcyRjdXJ2ZV9pZCA9IGZhY3Rvcihjb21iX3ByZWRzJGN1cnZlX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmNvbWJfZCRjdXJ2ZV9pZCA9IGZhY3Rvcihjb21iX2QkY3VydmVfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmNvbWJfc3VydiRNb250aCA9IGZhY3Rvcihjb21iX3N1cnYkTW9udGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmBgYAoKYGBge3J9CiMgT3JnYW5pemF0aW9uIG5vdGVzCiMgTWFpbiB0ZXh0IGluY2x1ZGVzIGVmZmVjdCBzaXplIGZpZ3VyZXMgCgojIFN1cHAgbWF0ZXJpYWwgaW5jbHVkZXM6IAojIFJhdyBkYXRhIHBsb3RzIGZvciBhbGwgZm91ciB0cmFpdHMgCiMgRWZmZWN0IHNpemUgcGxvdCBzaG93aW5nIGFsbCB0cmFpdHMgKGRvbmUpCiMgQ29udHJhc3RzIGZyb20gbW9kZWxpbmcgYXBwcm9hY2ggCmBgYAoKCgojIyBNYWluIFRleHQgRmlndXJlcwpgYGB7ciBmaWd1cmUtMi1jb21iaW5lZC10cGNzLCBmaWcuaGVpZ2h0PTZ9CmNvbWJfZXByX3Bsb3QgPSBjb21iX3ByZWRzICU+JSAKICBmaWx0ZXIobWV0cmljID09ICJFUFIiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoYWVzKHRlbXAsIHJhdGUsIGNvbG91ciA9IGN1cnZlX2lkKSwgCiAgICAgICAgICAgICBmaWx0ZXIoY29tYl9kLCBtZXRyaWMgPT0gIkVQUiIpLCAKICAgICAgICAgICAgIHNpemUgPSAxLjUsIGFscGhhID0gMC42LCAKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC41LCBoZWlnaHQgPSAwKSkgKwogIGdlb21fcmliYm9uKGFlcyh0ZW1wLCB5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIsIGdyb3VwID0gY3VydmVfaWQpLCAKICAgICAgICAgICAgICBmaWx0ZXIoY29tYl9ib290X2NvbmZfcHJlZHMsIG1ldHJpYyA9PSAiRVBSIiksIAogICAgICAgICAgICAgIGZpbGwgPSAnZ3JleTYwJywgYWxwaGEgPSAwLjMpICsKICBnZW9tX2xpbmUoYWVzKHRlbXAsIC5maXR0ZWQsIGNvbCA9IGN1cnZlX2lkKSwgbGluZXdpZHRoID0gMikgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29tYl9jb2xvcnMpICsgCiAgbGFicyh4ID0gIiIsIAogICAgICAgeSA9ICJFZ2cgUHJvZHVjdGlvbiBcbihlZ2dzL2ZlbWFsZS9kYXkpIiwKICAgICAgIGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJfaHNfcGxvdCA9IGNvbWJfcHJlZHMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIkhGIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyh0ZW1wLCByYXRlLCBjb2xvdXIgPSBjdXJ2ZV9pZCksIGZpbHRlcihjb21iX2QsIG1ldHJpYyA9PSAiSEYiKSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwLjYsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjUsIGhlaWdodCA9IDApKSArCiAgZ2VvbV9yaWJib24oYWVzKHRlbXAsIHltaW4gPSBjb25mX2xvd2VyLCB5bWF4ID0gY29uZl91cHBlciwgZ3JvdXAgPSBjdXJ2ZV9pZCksIGZpbHRlcihjb21iX2Jvb3RfY29uZl9wcmVkcywgbWV0cmljID09ICJIRiIpLCBmaWxsID0gJ2dyZXk2MCcsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9saW5lKGFlcyh0ZW1wLCAuZml0dGVkLCBjb2wgPSBjdXJ2ZV9pZCksIGxpbmV3aWR0aCA9IDIpICsKICAjc2NhbGVfY29sb3JfYnJld2VyKHR5cGUgPSAiZGl2IiwgcGFsZXR0ZSA9IDUsIGRpcmVjdGlvbiA9IC0xKSArIAogICNzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1ha28iKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29tYl9jb2xvcnMpICsgCiAgbGFicyh4ID0gIiIsIAogICAgICAgeSA9ICJIYXRjaGluZyBTdWNjZXNzIFxuKCUpIiwKICAgICAgIGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJfcmZfcGxvdCA9IGNvbWJfcHJlZHMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIlJGIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyh0ZW1wLCByYXRlLCBjb2xvdXIgPSBjdXJ2ZV9pZCksIGZpbHRlcihjb21iX2QsIG1ldHJpYyA9PSAiUkYiKSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwLjYsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjUsIGhlaWdodCA9IDApKSArCiAgZ2VvbV9yaWJib24oYWVzKHRlbXAsIHltaW4gPSBjb25mX2xvd2VyLCB5bWF4ID0gY29uZl91cHBlciwgZ3JvdXAgPSBjdXJ2ZV9pZCksIGZpbHRlcihjb21iX2Jvb3RfY29uZl9wcmVkcywgbWV0cmljID09ICJSRiIpLCBmaWxsID0gJ2dyZXk2MCcsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9saW5lKGFlcyh0ZW1wLCAuZml0dGVkLCBjb2wgPSBjdXJ2ZV9pZCksIGxpbmV3aWR0aCA9IDIpICsKICAjc2NhbGVfY29sb3JfYnJld2VyKHR5cGUgPSAiZGl2IiwgcGFsZXR0ZSA9IDUsIGRpcmVjdGlvbiA9IC0xKSArIAogICNzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1ha28iKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29tYl9jb2xvcnMpICsgCiAgbGFicyh4ID0gIlRlbXBlcmF0dXJlICjCsEMpIiwgCiAgICAgICB5ID0gIk9mZnNwcmluZyBQcm9kdWN0aW9uIFxuKG9mZnNwcmluZy9mZW1hbGUvZGF5KSIsCiAgICAgICBjb2xvdXIgPSAiTW9udGgiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpjb21iX3RzYyA9IGdncGxvdChjb21iX3N1cnYsIGFlcyh4PVRlbXAsIHk9U3VydiwgY29sb3VyPU1vbnRoKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MS41LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4xLCBoZWlnaHQ9MC4wMykpICsKICB4bGFiKCJUZW1wZXJhdHVyZSAowrBDKSIpKwogIHlsYWIoIlN1cnZpdm9yc2hpcCBcbihwcm9wb3J0aW9uIHN1cnZpdmVkKSIpKwogIGxhYnMoY29sb3VyID0gIk1vbnRoIikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLCBzZT1ULCBsaW5ld2lkdGggPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoMCwxKSkgKyAKICAjc2NhbGVfY29sb3JfYnJld2VyKHR5cGUgPSAiZGl2IiwgcGFsZXR0ZSA9IDUsIGRpcmVjdGlvbiA9IC0xKSArIAogICNzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1ha28iKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29tYl9jb2xvcnMpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmdnYXJyYW5nZShjb21iX2Vwcl9wbG90LCBjb21iX2hzX3Bsb3QsIGNvbWJfcmZfcGxvdCwgY29tYl90c2MsIAogICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAyLAogICAgICAgICAgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJib3R0b20iLCAKICAgICAgICAgIGxhYmVscyA9ICJBVVRPIiwgdmp1c3QgPSAxKQoKIyBnZ2FycmFuZ2UoY29tYl9lcHJfcGxvdCwgY29tYl9oc19wbG90LCBjb21iX3JmX3Bsb3QsIGNvbWJfdHNjLCBucm93ID0gMSwKIyAgICAgICAgICAgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJib3R0b20iKQpgYGAKCmBgYHtyIGZpZ3VyZS0zLWN1cnZlLXBhcmFtZXRlcnMsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRiwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9N30KY29tYmluZWRfb3B0X2NvbGwgPSBjb21iX3BhcmFtcyAlPiUgCiAgZmlsdGVyKG1ldHJpYyA9PSAiUkYiICYgdGVybSA9PSAidG9wdCIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBncm93dGhfdGVtcCwgeSA9IGVzdGltYXRlLCBzaGFwZSA9IHNwZWNpZXMpKSArIAogIGdlb21fc21vb3RoKGRhdGEgPSBmaWx0ZXIoY29tYl9wYXJhbXMsIG1ldHJpYyA9PSAiUkYiICYgdGVybSA9PSAidG9wdCIgJiBjdXJ2ZV9pZCAhPSAiTm92ZW1iZXJfMiIpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJncmV5NTAiKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHlsYWIoIk9wdGltdW0gKMKwQykiKSArIAogIHhsYWIoIkNvbGxlY3Rpb24gVGVtcGVyYXR1cmUgKMKwQykiKSArIAogIGxhYnMoY29sb3VyID0gIk1vbnRoIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKY29tYmluZWRfb3B0X2RpZmYgPSBjb21iX3BhcmFtcyAlPiUgCiAgZmlsdGVyKG1ldHJpYyA9PSAiUkYiICYgdGVybSA9PSAidG9wdCIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBncm93dGhfdGVtcCwgeSA9IG1hcmdpbiwgc2hhcGUgPSBzcGVjaWVzKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV3aWR0aCA9MSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fc21vb3RoKGRhdGEgPSBmaWx0ZXIoY29tYl9wYXJhbXMsIG1ldHJpYyA9PSAiUkYiICYgdGVybSA9PSAidG9wdCIgJiBjdXJ2ZV9pZCAhPSAiTm92ZW1iZXJfMiIpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJncmV5NTAiKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsgCiAgeWxhYigiTWFyZ2luICjCsEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIikgKyAKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNiwyMSkpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikgCgpjb21iaW5lZF9sZF9jb2xsID0gZ2dwbG90KGNvbWJpbmVkX3RvbGVyYW5jZSwgYWVzKHggPSBDb2xsX3RlbXAsIHkgPSBMRDUwLCBzaGFwZSA9IHNwZWNpZXMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJncmV5NTAiKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHlsYWIoIlRoZXJtYWwgVG9sZXJhbmNlICjCsEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKY29tYmluZWRfbGRfZGlmZiA9IGdncGxvdChjb21iaW5lZF90b2xlcmFuY2UsIGFlcyh4ID0gQ29sbF90ZW1wLCB5ID0gbWFyZ2luLCBzaGFwZSA9IHNwZWNpZXMpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImdyZXk1MCIpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgc3Ryb2tlID0gMSkgKyAKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNiwyMSkpICsgCiAgeWxhYigiV2FybWluZyBUb2xlcmFuY2UgKMKwQykiKSArIAogIHhsYWIoIkNvbGxlY3Rpb24gVGVtcGVyYXR1cmUgKMKwQykiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpnZ2FycmFuZ2UoY29tYmluZWRfb3B0X2NvbGwsIGNvbWJpbmVkX29wdF9kaWZmLCBjb21iaW5lZF9sZF9jb2xsLCBjb21iaW5lZF9sZF9kaWZmLCBuY29sID0gMiwgbnJvdyA9IDIsIGNvbW1vbi5sZWdlbmQgPSBULAogICAgICAgICAgbGVnZW5kID0gImJvdHRvbSIsIGxhYmVscyA9ICJBVVRPIikKYGBgCgpgYGB7ciBmMC1oYXRjaGVkLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD02fQpmMF9tb2RlbF9mZW1hbGVzID0gRjBfZXByICU+JSAKICBncm91cF9ieShNb250aCwgVHJlYXRtZW50LCBGZW1hbGUpICU+JSAKICBjb3VudCgpICU+JSAKICBmaWx0ZXIobiA9PSAyKSAlPiUgCiAgbXV0YXRlKCdmZW1hbGVfSUQnID0gcGFzdGUoTW9udGgsIFRyZWF0bWVudCwgRmVtYWxlLCBzZXAgPSAiXyIpKQoKZjBfbW9kZWxfZGF0YSA9IEYwX2VwciAlPiUgCiAgbXV0YXRlKCdmZW1hbGVfSUQnID0gcGFzdGUoTW9udGgsIFRyZWF0bWVudCwgRmVtYWxlLCBzZXAgPSAiXyIpKSAlPiUgCiAgZmlsdGVyKGZlbWFsZV9JRCAlaW4lIGYwX21vZGVsX2ZlbWFsZXMkZmVtYWxlX0lEKSAlPiUgCiAgbXV0YXRlKERheSA9IGlmX2Vsc2UoRGF5ID09ICIxX3RvXzMiLCAiU2hvcnQiLCAiTG9uZyIpLAogICAgICAgICBNb250aCA9IGZjdF9yZWxldmVsKE1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSwKICAgICAgICAgRGF5ID0gZmN0X3JlbGV2ZWwoRGF5LCAiU2hvcnQiLCAiTG9uZyIpKQpgYGAKCmBgYHtyfQpGMF9oYXRjaGVkLm1vZGVsID0gbG1lNDo6Z2xtZXIoZGF0YSA9IGYwX21vZGVsX2RhdGEsIGZhbWlseSA9IHBvaXNzb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGF0Y2hlZCB+IFRyZWF0bWVudCAqIERheSAqIE1vbnRoICsgKDF8ZmVtYWxlX0lEKSkKCnN1bW1hcnkoRjBfaGF0Y2hlZC5tb2RlbCkKCmtuaXRyOjprYWJsZShjYXI6OkFub3ZhKEYwX2hhdGNoZWQubW9kZWwsIHR5cGUgPSAiSUlJIikpCmBgYAoKYGBge3J9CmtuaXRyOjprYWJsZShlbW1lYW5zOjplbW1lYW5zKEYwX2hhdGNoZWQubW9kZWwsIH4gRGF5IHwgVHJlYXRtZW50ICogTW9udGgsIHR5cGUgPSAicmVzcG9uc2UiKSAlPiUgcGFpcnMoKSkKCmtuaXRyOjprYWJsZShlbW1lYW5zOjplbW1lYW5zKEYwX2hhdGNoZWQubW9kZWwsIH4gVHJlYXRtZW50IHwgRGF5ICogTW9udGgsIHR5cGUgPSAicmVzcG9uc2UiKSAlPiUgcGFpcnMoKSkKCmYwX2VmZmVjdHMgPSBlbW1lYW5zOjplbW1lYW5zKEYwX2hhdGNoZWQubW9kZWwsIH4gVHJlYXRtZW50IHwgRGF5ICogTW9udGgsIHR5cGUgPSAicmVzcG9uc2UiKSAlPiUgcGFpcnMoKSAlPiUgZGF0YS5mcmFtZSgpICU+JSAKICBtdXRhdGUoRGF5ID0gZmN0X3JlbGV2ZWwoRGF5LCAiU2hvcnQiLCAiTG9uZyIpLAogICAgICAgICBNb250aCA9IGZjdF9yZWxldmVsKE1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IERheSwgeSA9IHJhdGlvLCBzaGFwZSA9IERheSkpICsgCiAgZmFjZXRfd3JhcCgufk1vbnRoLCBucm93ID0gMSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMyksIAogICAgICAgICAgICAgc2l6ZSA9IDcpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHJhdGlvIC0gU0UsIHltYXggPSByYXRpbyArIFNFKSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjMpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsIGxpbmV3aWR0aCA9IDEpICsgCiAgbGFicyh4ID0gIkR1cmF0aW9uIiwgCiAgICAgICB5ID0gIlJhdGlvIChDb250cm9sOkhlYXR3YXZlKSIsCiAgICAgICBzaGFwZSA9ICJEdXJhdGlvbiIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMjApICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCAKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIGYxLWhhdGNoZWQsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9CmYxX21vZGVsX2RhdGEgPSBGMV9lcHIgJT4lIAogIG11dGF0ZShPZmZzcHJpbmdfdGVtcCA9IGFzLmZhY3RvcihPZmZzcHJpbmdfdGVtcCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShEYXkgPSBpZl9lbHNlKERheSA9PSAiMV90b18zIiwgIlNob3J0IiwgIkxvbmciKSwKICAgICAgICAgTW9udGggPSBmY3RfcmVsZXZlbChNb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIiksCiAgICAgICAgIERheSA9IGZjdF9yZWxldmVsKERheSwgIlNob3J0IiwgIkxvbmciKSkKYGBgCgoKYGBge3IgcmF3LWRhdGEtcGxvdHMsIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD0xMn0KCmYwX2Vwcl9wbG90ID0gZ2dwbG90KGYwX21vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgIGFlcyh4ID0gRGF5LCB5ID0gVG90YWwsIGNvbG91ciA9IFRyZWF0bWVudCkpICsgCiAgZmFjZXRfZ3JpZCgufk1vbnRoLCBzY2FsZXMgPSAiZnJlZV95IikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAogIGdlb21fYm94cGxvdChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgICAgd2lkdGggPSAwLjMpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiSGVhdHdhdmUiID0gImNvcmFsMyIsICJDb250cm9sIiA9ICJza3libHVlMyIpKSArIAogIGxhYnMoeSA9ICJFZ2cgUHJvZHVjdGlvbiBcbihwZXIgZmVtYWxlIHBlciBkYXkpIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwMCwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkKCmYxX2Vwcl9wbG90ID0gZ2dwbG90KGYxX21vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgIGFlcyh4ID0gZmFjdG9yKE9mZnNwcmluZ190ZW1wKSwgeSA9IFRvdGFsLCBjb2xvdXIgPSBQYXJlbnRhbF90cmVhdG1lbnQpKSArIAogIGZhY2V0X2dyaWQoTW9udGh+RGF5KSArIAogICNnZW9tX3Zpb2xpbihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSkpICsgCiAgZ2VvbV9ib3hwbG90KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICB3aWR0aCA9IDAuMykgKyAKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJIZWF0d2F2ZSIgPSAiY29yYWwzIiwgIkNvbnRyb2wiID0gInNreWJsdWUzIikpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoMCwgMTAwLCAyMDApKSArIAogIGxhYnMoeCA9ICJPZmZzcHJpbmcgVGVtcC4gKMKwQykiLCAKICAgICAgIHkgPSAiRWdnIFByb2R1Y3Rpb24gXG4ocGVyIGZlbWFsZSBwZXIgZGF5KSIsCiAgICAgICBjb2xvdXIgPSAiUGFyZW50YWwgVHJlYXRtZW50IikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpCgpyYXdfZXByID0gZ2dhcnJhbmdlKGYwX2Vwcl9wbG90LCBmMV9lcHJfcGxvdCwgbnJvdyA9IDIsIAogICAgICAgICAgaGVpZ2h0cyA9IGMoMC4zLCAwLjcpLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gImJvdHRvbSIpCgojIyMKCmYwX2hzX3Bsb3QgPSBnZ3Bsb3QoZjBfbW9kZWxfZGF0YSwgCiAgICAgICAgICAgICAgICAgYWVzKHggPSBEYXksIHkgPSBTdWNjZXNzLCBjb2xvdXIgPSBUcmVhdG1lbnQpKSArIAogIGZhY2V0X2dyaWQoLn5Nb250aCwgc2NhbGVzID0gImZyZWVfeSIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICAgIHdpZHRoID0gMC4zKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIkhlYXR3YXZlIiA9ICJjb3JhbDMiLCAiQ29udHJvbCIgPSAic2t5Ymx1ZTMiKSkgKyAKICBsYWJzKHkgPSAiSGF0Y2hpbmcgU3VjY2VzcyIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMDAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpCgpmMV9oc19wbG90ID0gZ2dwbG90KGYxX21vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgIGFlcyh4ID0gZmFjdG9yKE9mZnNwcmluZ190ZW1wKSwgeSA9IFN1Y2Nlc3MsIGNvbG91ciA9IFBhcmVudGFsX3RyZWF0bWVudCkpICsgCiAgZmFjZXRfZ3JpZChNb250aH5EYXkpICsgCiAgI2dlb21fdmlvbGluKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSkgKyAKICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICAgIHdpZHRoID0gMC4zKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIkhlYXR3YXZlIiA9ICJjb3JhbDMiLCAiQ29udHJvbCIgPSAic2t5Ymx1ZTMiKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAxKSkgKyAKICBsYWJzKHggPSAiT2Zmc3ByaW5nIFRlbXAuICjCsEMpIiwgCiAgICAgICB5ID0gIkhhdGNoaW5nIFN1Y2Nlc3MiLAogICAgICAgY29sb3VyID0gIlBhcmVudGFsIFRyZWF0bWVudCIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKQoKcmF3X2hzID0gZ2dhcnJhbmdlKGYwX2hzX3Bsb3QsIGYxX2hzX3Bsb3QsIG5yb3cgPSAyLCAKICAgICAgICAgIGhlaWdodHMgPSBjKDAuMywgMC43KSwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJib3R0b20iKQoKIyMjCgpmMF9wcm9kX3Bsb3QgPSBnZ3Bsb3QoZjBfbW9kZWxfZGF0YSwgCiAgICAgICAgICAgICAgICAgYWVzKHggPSBEYXksIHkgPSBIYXRjaGVkLCBjb2xvdXIgPSBUcmVhdG1lbnQpKSArIAogIGZhY2V0X2dyaWQoLn5Nb250aCwgc2NhbGVzID0gImZyZWVfeSIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICAgIHdpZHRoID0gMC4zKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIkhlYXR3YXZlIiA9ICJjb3JhbDMiLCAiQ29udHJvbCIgPSAic2t5Ymx1ZTMiKSkgKyAKICBsYWJzKHkgPSAiT2Zmc3ByaW5nIFByb2R1Y3Rpb24gXG4ocGVyIGZlbWFsZSBwZXIgZGF5KSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMDAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpCgpmMV9wcm9kX3Bsb3QgPSBnZ3Bsb3QoZjFfbW9kZWxfZGF0YSwgCiAgICAgICAgICAgICAgICAgYWVzKHggPSBmYWN0b3IoT2Zmc3ByaW5nX3RlbXApLCB5ID0gSGF0Y2hlZCwgY29sb3VyID0gUGFyZW50YWxfdHJlYXRtZW50KSkgKyAKICBmYWNldF9ncmlkKE1vbnRofkRheSkgKyAKICAjZ2VvbV92aW9saW4ocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArIAogIGdlb21fYm94cGxvdChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgICAgd2lkdGggPSAwLjMpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiSGVhdHdhdmUiID0gImNvcmFsMyIsICJDb250cm9sIiA9ICJza3libHVlMyIpKSArIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDEwMCwgMjAwKSkgKyAKICBsYWJzKHggPSAiT2Zmc3ByaW5nIFRlbXAuICjCsEMpIiwgCiAgICAgICB5ID0gIk9mZnNwcmluZyBQcm9kdWN0aW9uIFxuKHBlciBmZW1hbGUgcGVyIGRheSkiLAogICAgICAgY29sb3VyID0gIlBhcmVudGFsIFRyZWF0bWVudCIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKQoKcmF3X3Byb2R1Y3Rpb24gPSBnZ2FycmFuZ2UoZjBfcHJvZF9wbG90LCBmMV9wcm9kX3Bsb3QsIG5yb3cgPSAyLCAKICAgICAgICAgIGhlaWdodHMgPSBjKDAuMywgMC43KSwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJib3R0b20iKQoKZ2dhcnJhbmdlKHJhd19lcHIsIHJhd19ocywgcmF3X3Byb2R1Y3Rpb24sIG5yb3cgPSAxLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gImJvdHRvbSIsCiAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3J9CiMgRjFfaGF0Y2hlZC5tb2RlbCA9IGxtZTQ6OmdsbWVyKGRhdGEgPSBmMV9tb2RlbF9kYXRhLCBmYW1pbHkgPSBwb2lzc29uLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGF0Y2hlZCB+IFBhcmVudGFsX3RyZWF0bWVudCAqIERheSAqIE9mZnNwcmluZ190ZW1wICsgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgKyBQYXJlbnRhbF90cmVhdG1lbnR8TW9udGgpKQoKRjFfaGF0Y2hlZC5tb2RlbCA9IGdsbShkYXRhID0gZjFfbW9kZWxfZGF0YSwgZmFtaWx5ID0gInBvaXNzb24iLAogICAgICAgICAgICAgICAgICAgICAgIEhhdGNoZWQgfiBQYXJlbnRhbF90cmVhdG1lbnQgKiBEYXkgKiBPZmZzcHJpbmdfdGVtcCAqIE1vbnRoKQoKc3VtbWFyeShGMV9oYXRjaGVkLm1vZGVsKQojY2FyOjpBbm92YShGMV9oYXRjaGVkLm1vZGVsLHRlc3QgPSAiRiIsIHR5cGUgPSAiSUlJIikKYGBgCgpgYGB7ciBtb2RlbC1jb250cmFzdHMtcHJvZHVjdGlvbiwgZmlnLndpZHRoID0gOSwgZmlnLmhlaWdodD0gMTJ9CmYxX2hhdGNoZWRfY29udHJhc3RzID0gZW1tZWFuczo6ZW1tZWFucyhGMV9oYXRjaGVkLm1vZGVsLCB+IFBhcmVudGFsX3RyZWF0bWVudCB8IERheSAqIE1vbnRoICogT2Zmc3ByaW5nX3RlbXAsIHR5cGUgPSAicmVzcG9uc2UiKSAlPiUgcGFpcnMoKSAlPiUgZGF0YS5mcmFtZSgpICU+JSAKICAjbXV0YXRlKGVzdGltYXRlID0gZXN0aW1hdGUgKiAtMSkgJT4lIAogIGRyb3BfbmEoKSAlPiUgCiAgbXV0YXRlKCJJRCIgPSBwYXN0ZTAoTW9udGgsIE9mZnNwcmluZ190ZW1wKSkKCmYxX2VmZmVjdHMgPSBnZ3Bsb3QoZjFfaGF0Y2hlZF9jb250cmFzdHMsIGFlcyh4ID0gRGF5LCB5ID0gcmF0aW8sIGdyb3VwID0gSUQpKSArIAogIGZhY2V0X2dyaWQoT2Zmc3ByaW5nX3RlbXB+TW9udGgpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSkgKwogIGdlb21fbGluZShsaW5ld2lkdGggPSAwLjgpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcmF0aW8gLSBTRSwgeW1heCA9IHJhdGlvICsgU0UpLCB3aWR0aCA9IDAuMSwgbGluZXdpZHRoID0gMSkgKyAKICBsYWJzKHggPSAiRHVyYXRpb24iLCAKICAgICAgIHkgPSAiUmF0aW8gKENvbnRyb2w6SGVhdHdhdmUpIikgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAyMCkgKyAKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKZ2dhcnJhbmdlKGYwX2VmZmVjdHMsIGYxX2VmZmVjdHMsIG5yb3cgPSAyLCBoZWlnaHRzID0gYygwLjMsIDAuNykpCmBgYAoKYGBge3J9CmYxX3NpemVfZGF0YSA9IEYxX2ZicyAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoRGF5ID0gaWZfZWxzZShEYXkgPT0gIjFfdG9fMyIsICJTaG9ydCIsICJMb25nIiksCiAgICAgICAgIE1vbnRoID0gZmN0X3JlbGV2ZWwoTW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpLAogICAgICAgICBEYXkgPSBmY3RfcmVsZXZlbChEYXksICJTaG9ydCIsICJMb25nIikpCgpGMV9zaXplLm1vZGVsID0gZ2xtKGRhdGEgPSBmMV9zaXplX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSB+IFBhcmVudGFsX3RyZWF0bWVudCAqIERheSAqIE9mZnNwcmluZ190ZW1wICogTW9udGgpCgpzdW1tYXJ5KEYxX3NpemUubW9kZWwpCmNhcjo6QW5vdmEoRjFfc2l6ZS5tb2RlbCwgdHlwZSA9ICJJSUkiKQpgYGAKCmBgYHtyIGYxLXNpemUsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0PTZ9CmRheV9jb2xzID0gYygiU2hvcnQiID0gImdyZXk4MCIsICJMb25nIiA9ICJncmV5MzAiKQoKc2l6ZV90ZW1wMSA9IGdncGxvdChmMV9zaXplX2RhdGEsIGFlcyh4ID0gT2Zmc3ByaW5nX3RlbXAsIHkgPSBTaXplLCBjb2xvdXIgPSBQYXJlbnRhbF90cmVhdG1lbnQpKSArIAogIGZhY2V0X2dyaWQoTW9udGh+RGF5KSArIAogIGdlb21faml0dGVyKHdpZHRoID0gMC41LCBzaXplID0gMS42LCBhbHBoYSA9IDAuNCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGxpbmV3aWR0aCA9IDEuNCwgYWxwaGEgPSAwLjIpICsgCiAgbGFicyh4ID0gIk9mZnNwcmluZyBUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICB5ID0gIlNpemUgKG1tKSIsCiAgICAgICBjb2xvdXIgPSAiUGFyZW50YWwgVHJlYXRtZW50IikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygxMiwxNywyMikpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJIZWF0d2F2ZSIgPSAiY29yYWwzIiwgIkNvbnRyb2wiID0gInNreWJsdWUzIikpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxNSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiYmxhY2siKSkKCiNjYXI6OkFub3ZhKGYxX3NpemUubW9kZWwsIHR5cGUgPSAiSUlJIikKc2l6ZV90ZW1wMiA9IGVtbWVhbnM6OmVtdHJlbmRzKEYxX3NpemUubW9kZWwsIGMoIk1vbnRoIiwgIkRheSIsICJQYXJlbnRhbF90cmVhdG1lbnQiKSwgdmFyID0gIk9mZnNwcmluZ190ZW1wIikgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gUGFyZW50YWxfdHJlYXRtZW50LCB5ID0gT2Zmc3ByaW5nX3RlbXAudHJlbmQsIAogICAgICAgICAgICAgY29sb3VyID0gRGF5LCBncm91cCA9IERheSkpICsgCiAgZmFjZXRfd3JhcChNb250aH4uKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEuNSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxvd2VyLkNMLCB5bWF4ID0gdXBwZXIuQ0wpLAogICAgICAgICAgICAgICAgbGluZXdpZHRoID0gMS41LCB3aWR0aCA9IDAuNSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGRheV9jb2xzKSArIAogIGxhYnMoeCA9ICJQYXJlbnRhbCBUcmVhdG1lbnQiLCAgCiAgICAgICB5ID0gIlNpemUgU2xvcGUgKG1tIC8gwrBDKSIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxNSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSwKICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKQoKZ2dhcnJhbmdlKHNpemVfdGVtcDEsIHNpemVfdGVtcDIsIGxhYmVscyA9ICJBVVRPIiwgY29tbW9uLmxlZ2VuZCA9IEYsIGxlZ2VuZCA9ICJib3R0b20iKQpgYGAKCmBgYHtyIG1vZGVsLWNvbnRyYXN0cy1zaXplLCBmaWcud2lkdGggPSA5LCBmaWcuaGVpZ2h0PSA5fQpmMV9zaXplX2NvbnRyYXN0cyA9IGVtbWVhbnM6OmVtbWVhbnMoRjFfc2l6ZS5tb2RlbCwgfiBQYXJlbnRhbF90cmVhdG1lbnQgfCBEYXkgKiBNb250aCAqIE9mZnNwcmluZ190ZW1wLCB0eXBlID0gInJlc3BvbnNlIiwgYXQgPSBsaXN0KE9mZnNwcmluZ190ZW1wID0gYygxMiwxNywyMikpKSAlPiUgcGFpcnMoKSAlPiUgZGF0YS5mcmFtZSgpICU+JSAKICBkcm9wX25hKCkgJT4lIAogIG11dGF0ZSgiSUQiID0gcGFzdGUwKE1vbnRoLCBPZmZzcHJpbmdfdGVtcCkpICU+JSAKICBmaWx0ZXIoIShJRCA9PSAiTm92ZW1iZXIxMiIgJiBEYXkgPT0gIlNob3J0IikpICU+JSAKICBmaWx0ZXIoIShJRCA9PSAiTm92ZW1iZXIyMiIgJiBEYXkgPT0gIlNob3J0IikpCgpnZ3Bsb3QoZjFfc2l6ZV9jb250cmFzdHMsIGFlcyh4ID0gRGF5LCB5ID0gZXN0aW1hdGUsIGdyb3VwID0gSUQpKSArIAogIGZhY2V0X2dyaWQoT2Zmc3ByaW5nX3RlbXB+TW9udGgpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fbGluZShsaW5ld2lkdGggPSAwLjgpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZXN0aW1hdGUgLSBTRSwgeW1heCA9IGVzdGltYXRlICsgU0UpLCB3aWR0aCA9IDAuMSwgbGluZXdpZHRoID0gMSkgKyAKICBsYWJzKHggPSAiRHVyYXRpb24iLCAKICAgICAgIHkgPSAiRWZmZWN0IChtbTsgQ29udHJvbCAtIEhlYXR3YXZlKSIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMjApICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7cn0KIyBGMF9yZl9zdW1tYXJ5JG1vbnRoID0gZmFjdG9yKEYwX3JmX3N1bW1hcnkkbW9udGgsIGxldmVscyA9IGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpCiMgRjBfcmZfc3VtbWFyeSRkdXJhdGlvbiA9IGZhY3RvcihGMF9yZl9zdW1tYXJ5JGR1cmF0aW9uLCBsZXZlbHMgPSBjKCJzaG9ydCIsICJsb25nIikpCiMgRjBfZHVyX3N1bW1hcnkkbW9udGggPSBmYWN0b3IoRjBfZHVyX3N1bW1hcnkkbW9udGgsIGxldmVscyA9IGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpCiMgCiMgcGFyYW1fbGlzdCA9IGxpc3QoImNvbG91ciIgPSAiYmxhY2siLAojICAgICAgICAgICAgICAgICAgICJ3aWR0aCIgPSAwLjIpIAojIAojIFJGX3Nob3J0X2RiID0gcGxvdChGMF9SRl9zaG9ydCwgCiMgICAgICAgICAgICAgICAgICAgIGF4ZXMudGl0bGUuZm9udHNpemUgPSAxMCwKIyAgICAgICAgICAgICAgICAgICAgdGljay5mb250c2l6ZSA9IDEwLAojICAgICAgICAgICAgICAgICAgICBlZmZzaXplLm1hcmtlcnNpemUgPSAzLAojICAgICAgICAgICAgICAgICAgICBzd2FybXBsb3QucGFyYW1zID0gcGFyYW1fbGlzdCwKIyAgICAgICAgICAgICAgICAgICAgcmF3cGxvdC55bGFiZWwgPSAiUHJvZHVjdGlvbiIsCiMgICAgICAgICAgICAgICAgICAgIHRoZW1lID0gZ2dwdWJyOjp0aGVtZV9wdWJyKCkpCiMgCiMgUkZfbG9uZ19kYiA9IHBsb3QoRjBfUkZfbG9uZywgCiMgICAgICAgICAgICAgICAgICAgYXhlcy50aXRsZS5mb250c2l6ZSA9IDEwLAojICAgICAgICAgICAgICAgICAgIHRpY2suZm9udHNpemUgPSAxMCwKIyAgICAgICAgICAgICAgICAgICBlZmZzaXplLm1hcmtlcnNpemUgPSAzLAojICAgICAgICAgICAgICAgICAgIHN3YXJtcGxvdC5wYXJhbXMgPSBwYXJhbV9saXN0LAojICAgICAgICAgICAgICAgICAgIHJhd3Bsb3QueWxhYmVsID0gIlByb2R1Y3Rpb24iLAojICAgICAgICAgICAgICAgICAgIHRoZW1lID0gZ2dwdWJyOjp0aGVtZV9wdWJyKCkpCiMgCiMgYjEgPSBnZ3Bsb3QoKSArIHRoZW1lX3B1YmNsZWFuKCkgKyBnZ3RpdGxlKCIgICAgICAgICAgU2hvcnQgSGVhdCBXYXZlcyIpCiMgYjIgPSBnZ3Bsb3QoKSArIHRoZW1lX3B1YmNsZWFuKCkgKyBnZ3RpdGxlKCIgICAgICAgICAgTG9uZyBIZWF0IFdhdmVzIikKIyBGMF9mZWN1bmRpdHlfcGxvdCA9IGdnYXJyYW5nZShiMSwgUkZfc2hvcnRfZGIsIGIyLCBSRl9sb25nX2RiLCBuY29sID0gMSwgbnJvdyA9IDQsIGhlaWdodHMgPSBjKDAuMSwgMSwgMC4xLCAxKSkKYGBgCgpgYGB7ciBmaWd1cmUtNC1zaW0taGVhdHdhdmUtZWZmZWN0cywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NX0KIyB4LmF4aXNfbGFiZWxzID0gYygiMSIgPSAic2hvcnQiLCAiMiIgPSAibG9uZyIsICIzIiA9ICJzaG9ydCIsICI0IiA9ICJsb25nIikKIyAKIyBGMF9ncmlkID0gRjBfcmZfc3VtbWFyeSAlPiUgCiMgICBtdXRhdGUobW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpICU+JSAKIyAgIGdncGxvdChhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIHNoYXBlID0gZHVyYXRpb24pKSArIAojICAgZmFjZXRfZ3JpZCguIH4gbW9udGgpICsgCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjMpICsKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEuMykgKyAKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDUsIGZpbGwgPSAid2hpdGUiKSArIAojICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJib2R5IHNpemUiID0gImdyZXk3NSIsICJwcm9kdWN0aW9uIiA9ICJibGFjayIpKSArIAojICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiMgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwojICAgZ2d0aXRsZSgiRGlyZWN0IEVmZmVjdHMgKEYwKSIpICsgCiMgICB4bGFiKCIiKSArCiMgICB5bGFiKCJFZmZlY3QgU2l6ZVxuSGVhdHdhdmUgLSBDb250cm9sIikgKyAKIyAgIHlsaW0oLTEsMS4xKSArIAojICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQojIAojIEYxX3N1bW1hcnkgPSBiaW5kX3Jvd3MoRjFfcmZfZWZmZWN0X3NpemUsIEYxX2JzX2VmZmVjdF9zaXplKSAlPiUgCiMgICBkcGx5cjo6c2VsZWN0KHZhcmlhYmxlLCBkaWZmZXJlbmNlLCAKIyAgICAgICAgICAgICAgICAgYmNhX2NpX2xvdywgYmNhX2NpX2hpZ2gsIAojICAgICAgICAgICAgICAgICBtb250aCwgZHVyYXRpb24sIHRyYWl0LCBnZW5lcmF0aW9uLCBvZmZfdGVtcCkgJT4lIAojICAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKIyAgICAgICAgICAib3JkZXJfbnVtYmVyIiA9IGNhc2Vfd2hlbigKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fc2hvcnQiIH4gMSwKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fbG9uZyIgfiAyLAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAiYm9keSBzaXplX3Nob3J0IiB+IDMsCiMgICAgICAgICAgICBvcmRlcl9jb2RlID09ICJib2R5IHNpemVfbG9uZyIgfiA0KSwKIyAgICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSkKIyAKIyBGMV9zdW1tYXJ5JG9yZGVyX251bWJlciA9IGZhY3RvcihGMV9zdW1tYXJ5JG9yZGVyX251bWJlciwgbGV2ZWxzID0gYygxLDIsMyw0KSkKIyBGMV9ncmlkID0gZ2dwbG90KEYxX3N1bW1hcnksIGFlcyh4ID0gb3JkZXJfbnVtYmVyLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIHNoYXBlID0gZHVyYXRpb24sIGdyb3VwID0gdHJhaXQpKSArCiMgICBmYWNldF9ncmlkKG9mZl90ZW1wIH4gbW9udGgsICkgKyAKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMykgKwojICAgZ2VvbV9saW5lKCkgKyAKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEpICsgCiMgICBnZW9tX3BvaW50KHNpemUgPSAzLCBmaWxsID0gIndoaXRlIikgKyAKIyAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYm9keSBzaXplIiA9ICJncmV5NzUiLCAicHJvZHVjdGlvbiIgPSAiYmxhY2siKSkgKyAKIyAgIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJsb25nIiA9IDE2LCAic2hvcnQiID0gMjEpKSArIAojICAgeGxpbSgwLjUsNC41KSArIAojICAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9IHguYXhpc19sYWJlbHMpICsKIyAgIHhsYWIoIiIpICsKIyAgIHlsYWIoIkVmZmVjdCBTaXplXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAojICAgZ2d0aXRsZSgiVHJhbnNnZW5lcmF0aW9uYWwgRWZmZWN0cyAoRjEpIikgKyAKIyAgIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSArIAojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQueCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siKSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSkKIyAKIyBnZ2FycmFuZ2UoRjBfZ3JpZCwgRjFfZ3JpZCwgbnJvdyA9IDIsIG5jb2wgPSAxLCBoZWlnaHRzID0gYygwLjQ1LDEpLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gInJpZ2h0IikKYGBgCgojIyBTdXBwbGVtZW50YWwgSW5mb3JtYXRpb24gICAKYGBge3IgcGFyYW1ldGVycy1tb250aCwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTF9CiNmaWVsZCB0cGMgcGFyYW1ldGVycwpjb21iX3BhcmFtcyAlPiUgIAogIG11dGF0ZShjdXJ2ZV9pZCA9IGZjdF9yZWxldmVsKGN1cnZlX2lkLCBjKCJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyXzEiLCAiTm92ZW1iZXJfMiIpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGN1cnZlX2lkLCB5ID0gZXN0aW1hdGUsIGNvbG91ciA9IHNwZWNpZXMpKSArCiAgZmFjZXRfd3JhcCh0ZXJtfm1ldHJpYywgc2NhbGVzID0gJ2ZyZWVfeScpICsgCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyb3lhbGJsdWUxIiwgImluZGlhbnJlZDIiKSkgKyAKICBsYWJzKHggPSAiTW9udGgiLAogICAgICAgeSA9ICJQYXJhbWV0ZXIgRXN0aW1hdGUiLAogICAgICAgY29sb3VyID0gIlNwZWNpZXMiKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMxNSwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSkpCmBgYAoKYGBge3IgcGFyYW1ldGVycy1jb2xsLXRlbXAsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTl9CiNmaWVsZCB0cGMgcGFyYW1ldGVycwpnZ3Bsb3QoY29tYl9wYXJhbXMsIGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBlc3RpbWF0ZSwgY29sb3VyID0gc3BlY2llcykpICsKICBmYWNldF93cmFwKHRlcm1+bWV0cmljLCBzY2FsZXMgPSAnZnJlZV95JykgKyAKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCBjdXJ2ZV9pZCAhPSAiTm92ZW1iZXJfMiIpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgZ2VvbV9saW5lcmFuZ2UoYWVzKHltaW4gPSBjb25mX2xvd2VyLCB5bWF4ID0gY29uZl91cHBlcikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInJveWFsYmx1ZTEiLCAiaW5kaWFucmVkMiIpKSArIAogIGxhYnMoeCA9ICJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIHkgPSAiUGFyYW1ldGVyIEVzdGltYXRlIiwKICAgICAgIGNvbG91ciA9ICJTcGVjaWVzIikgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgbWFyZ2lucy1jb2xsLXRlbXAsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTd9CmNvbWJfcGFyYW1zICU+JSAKICBmaWx0ZXIodGVybSA9PSAidG9wdCIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBncm93dGhfdGVtcCwgeSA9IG1hcmdpbiwgY29sb3VyID0gc3BlY2llcywgZ3JvdXAgPSBzcGVjaWVzKSkgKyAKICBmYWNldF9ncmlkKG1ldHJpY34uLCBzY2FsZXMgPSAnZnJlZV95JykgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IGZpbHRlcihjb21iX3BhcmFtcywgdGVybSA9PSAidG9wdCIgJiBjdXJ2ZV9pZCAhPSAiTm92ZW1iZXJfMiIpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIHNlID0gRiwgbGluZXdpZHRoID0gMSwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyb3lhbGJsdWUxIiwgImluZGlhbnJlZDIiKSkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSIsCiAgICAgICB5ID0gIlNhZmV0eSBNYXJnaW4iKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBlZmZlY3Qtc2l6ZS1ncmlkLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQojICNTdWJzZXF1ZW50IFJvd3MKIyBGMV9oc19lZmZlY3Rfc2l6ZSR0cmFpdCA9ICJzdWNjZXNzIgojIEYxX2hzX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCiMgCiMgRjFfdG90YWxfZWZmZWN0X3NpemUkdHJhaXQgPSAiZXByIgojIEYxX3RvdGFsX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCiMgCiMgRjFfcmZfZWZmZWN0X3NpemUkdHJhaXQgPSAicHJvZHVjdGlvbiIKIyBGMV9yZl9lZmZlY3Rfc2l6ZSRnZW5lcmF0aW9uID0gIkYxIgojIAojIEYxX2JzX2VmZmVjdF9zaXplJHRyYWl0ID0gImJvZHkgc2l6ZSIKIyBGMV9ic19lZmZlY3Rfc2l6ZSRnZW5lcmF0aW9uID0gIkYxIgojIAojIEYwX2RhdGEgPSBiaW5kX3Jvd3MoRjBfaHNfc3VtbWFyeSwgRjBfdG90YWxfc3VtbWFyeSxGMF9yZl9zdW1tYXJ5LCBGMF9zaXplX3N1bW1hcnkpICU+JSAKIyAgIGRwbHlyOjpzZWxlY3QodHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoLCBtb250aCwgZHVyYXRpb24sIHRyYWl0LCBnZW5lcmF0aW9uKSAlPiUgCiMgICBtdXRhdGUoIm9yZGVyX2NvZGUiID0gcGFzdGUodHJhaXQsIGR1cmF0aW9uLCBzZXAgPSAiXyIpLAojICAgICAgICAgICJvcmRlcl9udW1iZXIiID0gY2FzZV93aGVuKAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAidG90YWxfc2hvcnQiIH4gMSwKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInRvdGFsX2xvbmciIH4gMiwKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3Nfc2hvcnQiIH4gMywKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3NfbG9uZyIgfiA0LAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9zaG9ydCIgfiA1LAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9sb25nIiB+IDYsCiMgICAgICAgICAgICBvcmRlcl9jb2RlID09ICJzaXplX2xvbmciIH4gNyksCiMgICAgICAgICAgbW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIiksCiMgICAgICAgICAgdHJhaXQgPSBmY3RfcmVsZXZlbCh0cmFpdCwgInRvdGFsIiwgInN1Y2Nlc3MiLCAicHJvZHVjdGlvbiIsICJzaXplIiksCiMgICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgInNob3J0IiwgImxvbmciKSwKIyAgICAgICAgICBncm91cF9JRCA9IHBhc3RlKG1vbnRoLCB0cmFpdCwgc2VwID0gIl8iKSkKIyAKIyBGMF9kYXRhJG9yZGVyX251bWJlciA9IGZhY3RvcihGMF9kYXRhJG9yZGVyX251bWJlciwgbGV2ZWxzID0gYygxLDIsMyw0LDUsNiw3KSkKIyAKIyAKIyBGMV9kYXRhID0gYmluZF9yb3dzKEYxX3RvdGFsX2VmZmVjdF9zaXplLCBGMV9oc19lZmZlY3Rfc2l6ZSwgRjFfcmZfZWZmZWN0X3NpemUsIEYxX2JzX2VmZmVjdF9zaXplKSAlPiUgCiMgICBkcGx5cjo6c2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCwgbW9udGgsIGR1cmF0aW9uLCBnZW5lcmF0aW9uLCBvZmZfdGVtcCkgJT4lIAojICAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKIyAgICAgICAgICAib3JkZXJfbnVtYmVyIiA9IGNhc2Vfd2hlbigKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImVwcl9zaG9ydCIgfiAxLAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAiZXByX2xvbmciIH4gMiwKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3Nfc2hvcnQiIH4gMywKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3NfbG9uZyIgfiA0LAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9zaG9ydCIgfiA1LAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9sb25nIiB+IDYsCiMgICAgICAgICAgICBvcmRlcl9jb2RlID09ICJib2R5IHNpemVfc2hvcnQiIH4gNywKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImJvZHkgc2l6ZV9sb25nIiB+IDgpLAojICAgICAgICAgIHRyYWl0ID0gaWZfZWxzZSh0cmFpdCA9PSAiZXByIiwgInRvdGFsIiwgdHJhaXQpLAojICAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpLAojICAgICAgICAgIHRyYWl0ID0gZmN0X3JlbGV2ZWwodHJhaXQsICJ0b3RhbCIsICJzdWNjZXNzIiwgInByb2R1Y3Rpb24iLCAic2l6ZSIpLAojICAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sICJzaG9ydCIsICJsb25nIikpCiMgCiMgCiMgRjFfZGF0YSRvcmRlcl9udW1iZXIgPSBmYWN0b3IoRjFfZGF0YSRvcmRlcl9udW1iZXIsIGxldmVscyA9IGMoMSwyLDMsNCw1LDYsNyw4KSkKIyAKIyAjVG9wIHJvdyAtIEYwIChkaXJlY3QgZWZmZWN0cykKIyB4LmF4aXNfbGFiZWxzID0gYygiMSIgPSAic2hvcnQiLCAiMiIgPSAibG9uZyIsICIzIiA9ICJzaG9ydCIsICI0IiA9ICJsb25nIiwgCiMgICAgICAgICAgICAgICAgICAgIjUiID0gInNob3J0IiwgIjYiID0gImxvbmciLCAiNyIgPSAic2hvcnQiLCAiOCIgPSAibG9uZyIpCiMgCiMgRjBfZ3JpZCA9IGdncGxvdChGMF9kYXRhLCBhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIGdyb3VwID0gZ3JvdXBfSUQpKSArIAojICAgZmFjZXRfZ3JpZCguIH4gbW9udGgpICsgCiMgICBnZW9tX2xpbmUocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNyksCiMgICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKyAKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMykgKwojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksIHdpZHRoID0gMCwgbGluZXdpZHRoID0gMSwgCiMgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpKSArIAojICAgZ2VvbV9wb2ludChzaXplID0gNCwgZmlsbCA9ICJ3aGl0ZSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpKSArIAojICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiMgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwojICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJzaXplIiA9ICJkYXJrZ3JleSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiID0gImdvbGQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0aW9uIiA9ICJmb3Jlc3RncmVlbiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIiA9ICJjb3JuZmxvd2VyYmx1ZSIpKSArICAKIyAgIHhsYWIoIiIpICsKIyAgIHlsYWIoIkVmZmVjdCBTaXplXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAojICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQojIAojICNGb2xsb3dpbmcgdGhyZWUgcm93cyAtIEYxICh0cmFuc2dlbmVyYXRpb24gLyBpbmRpcmVjdCBlZmZlY3RzKQojIEYxX2dyaWQgPSBnZ3Bsb3QoRjFfZGF0YSwgYWVzKHggPSBkdXJhdGlvbiwgeSA9IGRpZmZlcmVuY2UsIGNvbG91ciA9IHRyYWl0LCBncm91cCA9IHRyYWl0KSkgKyAKIyAgIGZhY2V0X2dyaWQob2ZmX3RlbXAgfiBtb250aCwgKSArIAojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4zKSArCiMgICBnZW9tX2xpbmUocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiMgICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKyAKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEsCiMgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAojICAgZ2VvbV9wb2ludChzaXplID0gMywgZmlsbCA9ICJ3aGl0ZSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAojICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiMgICB4bGltKDAuNSw0LjUpICsgCiMgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwojICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJzaXplIiA9ICJkYXJrZ3JleSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiID0gImdvbGQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0aW9uIiA9ICJmb3Jlc3RncmVlbiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIiA9ICJjb3JuZmxvd2VyYmx1ZSIpKSArIAojICAgeGxhYigiIikgKwojICAgeWxhYigiRWZmZWN0IFNpemUgXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAojICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgc3RyaXAuYmFja2dyb3VuZC54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQojIAojIGdnYXJyYW5nZShGMF9ncmlkLCBGMV9ncmlkLCBucm93ID0gMiwgbmNvbCA9IDEsIGhlaWdodHMgPSBjKDAuMzUsMSksIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAicmlnaHQiLCBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3IgcHJvZHVjdGlvbi1zaXplLWNoYW5nZX0KIyBlZmZlY3RfY29yciA9IEYxX3N1bW1hcnkgJT4lIAojICAgc2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBtb250aCwgZHVyYXRpb24sIG9mZl90ZW1wKSAlPiUgIAojICAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IGMobW9udGgsIGR1cmF0aW9uLCBvZmZfdGVtcCksCiMgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gdHJhaXQsIAojICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBkaWZmZXJlbmNlKQojIAojIGdncGxvdChlZmZlY3RfY29yciwgYWVzKHggPSBgYm9keSBzaXplYCwgeSA9IHByb2R1Y3Rpb24pKSArIAojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsgCiMgICBnZW9tX3BvaW50KHNpemUgPSAzKSArIAojICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLAojICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk2MCIsCiMgICAgICAgICAgICAgICBzaXplID0gMSkgKyAKIyAgIGxhYnMoeCA9ICJCb2R5IFNpemUgRWZmZWN0IiwKIyAgICAgICAgeSA9ICJQcm9kdWN0aW9uIEVmZmVjdCIpICsgCiMgICB0aGVtZV9tYXR0KCkKYGBgCgoKYGBge3IgRjAtcHJvZHVjdGlvbiwgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojRjBfZmVjdW5kaXR5X3Bsb3QKYGBgCgpgYGB7ciBGMC1kdXJhdGlvbi1lZmZlY3RzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQojRWZmZWN0IG9mIGhlYXR3YXZlIGR1cmF0aW9uIFdJVEhJTiB0cmVhdG1lbnQKCmYwX21vZGVsX2RhdGEgJT4lICAKICBncm91cF9ieShUcmVhdG1lbnQsIERheSwgTW9udGgpICU+JSAKICBzdW1tYXJpc2UobWVhbl9oYXRjaGVkID0gbWVhbihIYXRjaGVkLCBuYS5ybSA9IFQpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYygiVHJlYXRtZW50IiwgIk1vbnRoIiksCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBtZWFuX2hhdGNoZWQsIAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBEYXkpICU+JSAKICBtdXRhdGUoImVmZmVjdCIgPSBMb25nIC0gU2hvcnQpCgpkdXJhdGlvbi5tb2RlbCA9IGxtZTQ6OmxtZXIoZGF0YSA9IGYwX21vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGF0Y2hlZCB+IFRyZWF0bWVudCAqIERheSAqIE1vbnRoICsgKDF8TW9udGgpKQoKZHVyYXRpb25fcGFpcnMgPSBlbW1lYW5zOjplbW1lYW5zKGR1cmF0aW9uLm1vZGVsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gRGF5IHwgTW9udGggKiBUcmVhdG1lbnQpICU+JSAKICBwYWlycygpCgphcy5kYXRhLmZyYW1lKHN1bW1hcnkoZHVyYXRpb25fcGFpcnMpKVtjKCdNb250aCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmVhdG1lbnQnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udHJhc3QnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXN0aW1hdGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0UnKV0gJT4lIAogIG11dGF0ZShNb250aCA9IGZjdF9yZWxldmVsKE1vbnRoLCBjKCJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKSwKICAgICAgICAgZXN0aW1hdGUgPSBlc3RpbWF0ZSAqIC0xKSAlPiUgI0ZsaXBzIHNpZ24gdG8gbWFrZSBjb250cmFzdCBMb25nIC0gU2hvcnQKICBnZ3Bsb3QoYWVzKHggPSBNb250aCwgZmlsbCA9IFRyZWF0bWVudCwgeSA9IGVzdGltYXRlKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBlc3RpbWF0ZSAtIFNFLCB5bWF4ID0gZXN0aW1hdGUgKyBTRSksCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMSwgbGluZXdpZHRoID0gMSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTMwIiwgIndoaXRlIikpICsgCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkR1cmF0aW9uIENvbnRyYXN0IFxuIExvbmcgLSBTaG9ydCBldmVudHMiKSArIAogIHRoZW1lX3B1YnIoYmFzZV9zaXplID0gMTgpCmBgYAoKYGBge3IgRjEtZHVyYXRpb24tZWZmZWN0cywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KIyBIb3cgZG9lcyBoZWF0IHdhdmUgZHVyYXRpb24gYWZmZWN0IHRyYW5zZ2VuZXJhdGlvbmFsIGVmZmVjdHM/IFJlYWN0aW9uIG5vcm1zIHNob3duIGJlbG93IGZvciBlZmZlY3Qgc2l6ZSBjb21wYXJpc29ucyAoaGVhdHdhdmUgLSBjb250cm9sKSBmb3IgZGlmZmVyZW50IGR1cmF0aW9uIG9mIHBhcmVudGFsIGV4cG9zdXJlCiMgRjFfZGF0YSAlPiUgCiMgICBkcGx5cjo6c2VsZWN0KG1vbnRoLCBkdXJhdGlvbiwgb2ZmX3RlbXAsIHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCkgJT4lIAojICAgbXV0YXRlKCJJRCIgPSBwYXN0ZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0LCBzZXAgPSAiXyIpLAojICAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsIGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpLAojICAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sIGMoInNob3J0IiwgImxvbmciKSkpICU+JSAKIyAgIGdncGxvdChhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gbW9udGgsIGdyb3VwID0gSUQpKSArIAojICAgZmFjZXRfd3JhcCh0cmFpdH4uKSArIAojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKIyAgIGdlb21fbGluZShzaXplID0gMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsgCiMgICBnZW9tX3BvaW50KHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLAojICAgICAgICAgICAgICAgICBzaXplID0gMC43NSwgd2lkdGggPSAwLjEsCiMgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjEpKSArIAojICAgbGFicyh4ID0gIlBhcmVudGFsIEV4cG9zdXJlIER1cmF0aW9uIiwgCiMgICAgICAgIHkgPSAiRWZmZWN0IFNpemUgKEhlZGdlJ3MgZykgXG4gSGVhdHdhdmUgLSBDb250cm9sIikgKyAKIyAgIHlsaW0oLTUsNSkgKyAKIyAgIHRoZW1lX3B1YnIoYmFzZV9zaXplID0gMTgpCmBgYAoKCmBgYHtyIHNpZy1GMS1kdXJhdGlvbi1lZmZlY3RzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQojICNQdWxscyBvdXQgcmVhY3Rpb24gbm9ybXMgd2hlcmUgdGhlcmUncyBhIHNpZ24gY2hhbmdlIChjaGFuZ2VzIGZyb20gcG9zaXRpdmUsIG5ldXRyYWwsIG9yIG5lZ2F0aXZlIGJldHdlZW4gZHVyYXRpb24gZ3JvdXBzKSAKIyAKIyBkdXJhdGlvbl9lZmZlY3RzID0gRjFfZGF0YSAlPiUgCiMgICBkcGx5cjo6c2VsZWN0KG1vbnRoLCBkdXJhdGlvbiwgb2ZmX3RlbXAsIHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCkgJT4lIAojICAgbXV0YXRlKCJJRCIgPSBwYXN0ZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0LCBzZXAgPSAiXyIpLAojICAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsIGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpLAojICAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sIGMoInNob3J0IiwgImxvbmciKSkpICU+JSAKIyAgIGdyb3VwX2J5KElELCB0cmFpdCwgZHVyYXRpb24pICU+JSAgCiMgICBtdXRhdGUoInplcm9fZGlmZiIgPSBjYXNlX3doZW4oCiMgICAgIHNpZ24oYmNhX2NpX2xvdykgPT0gc2lnbihiY2FfY2lfaGlnaCkgfiAiZG9lcyBub3Qgb3ZlcmxhcCB6ZXJvIiwKIyAgICAgc2lnbihiY2FfY2lfbG93KSAhPSBzaWduKGJjYV9jaV9oaWdoKSB+ICJvdmVybGFwcyB6ZXJvIgojICAgKSkgJT4lIAojICAgdW5ncm91cChkdXJhdGlvbikgJT4lIAojICAgbXV0YXRlKCJjaGFuZ2UiID0gY2FzZV93aGVuKAojICAgICBzaWduKGRpZmZlcmVuY2UpWzFdID09IHNpZ24oZGlmZmVyZW5jZSlbMl0gJiB6ZXJvX2RpZmZbMV0gPT0gemVyb19kaWZmWzJdIH4gIlNhbWUiLAojICAgICBzaWduKGRpZmZlcmVuY2UpWzFdICE9IHNpZ24oZGlmZmVyZW5jZSlbMl0gJiB6ZXJvX2RpZmZbMV0gPT0gIm92ZXJsYXBzIHplcm8iICYgemVyb19kaWZmWzJdID09ICJvdmVybGFwcyB6ZXJvIiB+ICJTYW1lIiwKIyAgICAgc2lnbihkaWZmZXJlbmNlKVsxXSAhPSBzaWduKGRpZmZlcmVuY2UpWzJdICYgemVyb19kaWZmWzFdID09IHplcm9fZGlmZlsyXSAmIHplcm9fZGlmZlsxXSA9PSAiZG9lcyBub3Qgb3ZlcmxhcCB6ZXJvIiB+ICJEaWZmZXJlbnQiLAojICAgICBzaWduKGRpZmZlcmVuY2UpWzFdICE9IHNpZ24oZGlmZmVyZW5jZSlbMl0gJiB6ZXJvX2RpZmZbMV0gIT0gemVyb19kaWZmWzJdIH4gIkRpZmZlcmVudCIsCiMgICAgIHNpZ24oZGlmZmVyZW5jZSlbMV0gPT0gc2lnbihkaWZmZXJlbmNlKVsyXSAmIHplcm9fZGlmZlsxXSAhPSB6ZXJvX2RpZmZbMl0gfiAiRGlmZmVyZW50IgojICAgKSkgJT4lIAojICAgYXJyYW5nZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0KSAlPiUgCiMgICBmaWx0ZXIoY2hhbmdlID09ICJEaWZmZXJlbnQiKQojIAojIHNlbGVjdF9ybm9ybXMgPSBkdXJhdGlvbl9lZmZlY3RzICU+JSAKIyAgIGRwbHlyOjpzZWxlY3QoLWR1cmF0aW9uLCAtZGlmZmVyZW5jZSwgLWJjYV9jaV9sb3csIC1iY2FfY2lfaGlnaCwgLUlELCAtemVyb19kaWZmKSAlPiUgCiMgICBkaXN0aW5jdCgpCiMgCiMgc2lnX2NoYW5nZXMgPSBGMV9kYXRhICU+JSAKIyAgIGRwbHlyOjpzZWxlY3QobW9udGgsIGR1cmF0aW9uLCBvZmZfdGVtcCwgdHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoKSAlPiUgCiMgICBtdXRhdGUoIklEIiA9IHBhc3RlKG1vbnRoLCBvZmZfdGVtcCwgdHJhaXQsIHNlcCA9ICJfIiksCiMgICAgICAgICAgbW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgYygiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSksCiMgICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgYygic2hvcnQiLCAibG9uZyIpKSkgJT4lIAojICAgZmlsdGVyKElEICVpbiUgc2VsZWN0X3Jub3JtcyRJRCkKIyAKIyBnZ3Bsb3Qoc2lnX2NoYW5nZXMsIGFlcyh4ID0gZHVyYXRpb24sIHkgPSBkaWZmZXJlbmNlLCBjb2xvdXIgPSBtb250aCwgZ3JvdXAgPSBJRCkpICsgCiMgICBmYWNldF93cmFwKHRyYWl0fi4pICsgCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAojICAgZ2VvbV9saW5lKHNpemUgPSAxLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjEpKSArIAojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksCiMgICAgICAgICAgICAgICAgIHNpemUgPSAwLjc1LCB3aWR0aCA9IDAuMSwKIyAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsgCiMgICBnZW9tX2xhYmVsX3JlcGVsKGRhdGEgPSBzaWdfY2hhbmdlcyAlPiUgZmlsdGVyKGR1cmF0aW9uID09ICJsb25nIiksIAojICAgICAgICAgICAgICAgICAgICBhZXMobGFiZWwgPSBvZmZfdGVtcCwgCiMgICAgICAgICAgICAgICAgICAgICAgICB4ID0gZHVyYXRpb24sCiMgICAgICAgICAgICAgICAgICAgICAgICB5ID0gZGlmZmVyZW5jZSwgCiMgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG1vbnRoKSwKIyAgICAgICAgICAgICAgICAgICAgYm94LnBhZGRpbmcgPSAwLjUsCiMgICAgICAgICAgICAgICAgICAgIG51ZGdlX3ggPSAwLjIsCiMgICAgICAgICAgICAgICAgICAgIHNpemUgPSA3LAojICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZD1GQUxTRSkgKyAKIyAgIGxhYnMoeCA9ICJQYXJlbnRhbCBFeHBvc3VyZSBEdXJhdGlvbiIsIAojICAgICAgICB5ID0gIkVmZmVjdCBTaXplIChIZWRnZSdzIGcpXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAojICAgeWxpbSgtNSw1KSArIAojICAgdGhlbWVfcHVicihiYXNlX3NpemUgPSAxOCkKYGBgCgoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHJkYXRhID0gZmlsZV9saXN0W3N0cl9kZXRlY3QoZmlsZV9saXN0LCBwYXR0ZXJuID0gIi5SRGF0YSIpXQojIGYxX2RhdGEgPSByZGF0YVtzdHJfZGV0ZWN0KHJkYXRhLCBwYXR0ZXJuID0gIkYwXyIsIG5lZ2F0ZSA9IFQpXSAlPiUgCiMgICBzdHJfc3BsaXRfZml4ZWQocGF0dGVybiA9ICIuUkRhdGEiLCBuID0gMikKIyBmMV9kYXRhID0gZjFfZGF0YVssMV0KIyAKIyBwbG90X25hbWVzID0gYygpCiMgZm9yKGkgaW4gMTpsZW5ndGgoZjFfZGF0YSkpewojICAgcGxvdF9uYW1lID0gcGFzdGUoZjFfZGF0YVtpXSwgIl9wbG90Iiwgc2VwID0gIiIpCiMgICBwbG90X25hbWVzID0gYyhwbG90X25hbWVzLCBwbG90X25hbWUpCiMgICBtZXRyaWMgPSBzdHJfc3BsaXRfZml4ZWQocGxvdF9uYW1lLCBwYXR0ZXJuID0gIl8iLCBuID0gNClbLDJdCiMgICAKIyAgIGlmKG1ldHJpYyA9PSAidG90YWwiKXsKIyAgICAgbGFiZWwgPSAiRWdnIFByb2R1Y3Rpb24gKHBlciBmZW1hbGUpIgojICAgfQojICAgCiMgICBpZihtZXRyaWMgPT0gInJmIil7CiMgICAgIGxhYmVsID0gIlByb2R1Y3Rpb24gKHBlciBmZW1hbGUpIgojICAgfQojICAgCiMgICBpZihtZXRyaWMgPT0gImhzIil7CiMgICAgIGxhYmVsID0gIkhhdGNoaW5nIFN1Y2Nlc3MgKCUpIgojICAgfQojICAgCiMgICBpZihtZXRyaWMgPT0gImJzIil7CiMgICAgIGxhYmVsID0gIkJvZHkgU2l6ZSAobW0pIgojICAgfQojICAgCiMgICBhc3NpZ24ocGxvdF9uYW1lLAojICAgICAgICAgIHBsb3QoZ2V0KGYxX2RhdGFbaV0pLCAKIyAgICAgICAgICAgICAgIGVmZnNpemUubWFya2Vyc2l6ZSA9IDIsCiMgICAgICAgICAgICAgICBheGVzLnRpdGxlLmZvbnRzaXplID0gOSwKIyAgICAgICAgICAgICAgIHRpY2suZm9udHNpemUgPSA2LAojICAgICAgICAgICAgICAgc3dhcm1wbG90LnBhcmFtcyA9IHBhcmFtX2xpc3QsCiMgICAgICAgICAgICAgICByYXdwbG90LnlsYWJlbCA9IGxhYmVsLAojICAgICAgICAgICAgICAgdGhlbWUgPSBnZ3B1YnI6OnRoZW1lX3B1YnIoKSkpCiMgfQojIAojIGJzX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX2JzXyIpXQojIHJmX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX3JmXyIpXQojIHRvdGFsX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX3RvdGFsXyIpXQojIGhzX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX2hzXyIpXQpgYGAKCmBgYHtyIEYxLWJvZHktc2l6ZS1lZmYtcGxvdHMsIGZpZy5oZWlnaHQ9MTEsIGZpZy53aWR0aD04LCBpbmNsdWRlID0gRn0KIyBnZ2FycmFuZ2UoSnVuZV9ic19zaG9ydF9wbG90LCBKdW5lX2JzX2xvbmdfcGxvdCwgCiMgICAgICAgICAgIEF1Z3VzdF9ic19zaG9ydF9wbG90LCBBdWd1c3RfYnNfbG9uZ19wbG90LAojICAgICAgICAgICBOb3ZlbWJlcl9ic19zaG9ydF9wbG90LCBOb3ZlbWJlcl9ic19sb25nX3Bsb3QsCiMgICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMywKIyAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iLAojICAgICAgICAgICB2anVzdCA9IC0wLjIpCmBgYAoKYGBge3IgRjEtdG90YWwtZXByLWVmZi1wbG90cywgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojIGdnYXJyYW5nZShKdW5lX3RvdGFsX3Nob3J0X3Bsb3QsIEp1bmVfdG90YWxfbG9uZ19wbG90LCAKIyAgICAgICAgICAgQXVndXN0X3RvdGFsX3Nob3J0X3Bsb3QsIEF1Z3VzdF90b3RhbF9sb25nX3Bsb3QsCiMgICAgICAgICAgIE5vdmVtYmVyX3RvdGFsX3Nob3J0X3Bsb3QsIE5vdmVtYmVyX3RvdGFsX2xvbmdfcGxvdCwKIyAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzLAojICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiMgICAgICAgICAgIHZqdXN0ID0gLTAuMikKYGBgCgpgYGB7ciBGMS1oYXRjaGluZy1zdWNjZXNzLWVmZi1wbG90cywgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojIGdnYXJyYW5nZShKdW5lX2hzX3Nob3J0X3Bsb3QsIEp1bmVfaHNfbG9uZ19wbG90LCAKIyAgICAgICAgICAgQXVndXN0X2hzX3Nob3J0X3Bsb3QsIEF1Z3VzdF9oc19sb25nX3Bsb3QsCiMgICAgICAgICAgIE5vdmVtYmVyX2hzX3Nob3J0X3Bsb3QsIE5vdmVtYmVyX2hzX2xvbmdfcGxvdCwKIyAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzLAojICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiMgICAgICAgICAgIHZqdXN0ID0gLTAuMikKYGBgCgpgYGB7ciBGMS1wcm9kdWN0aW9uLWVmZi1wbG90cywgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojIGdnYXJyYW5nZShKdW5lX3JmX3Nob3J0X3Bsb3QsIEp1bmVfcmZfbG9uZ19wbG90LCAKIyAgICAgICAgICAgQXVndXN0X3JmX3Nob3J0X3Bsb3QsIEF1Z3VzdF9yZl9sb25nX3Bsb3QsCiMgICAgICAgICAgIE5vdmVtYmVyX3JmX3Nob3J0X3Bsb3QsIE5vdmVtYmVyX3JmX2xvbmdfcGxvdCwKIyAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzLAojICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiMgICAgICAgICAgIHZqdXN0ID0gLTAuMikKYGBgCg==